View Source Quick guide on erlport Python API
You can read more about this in the erlport documentation
You can find the default data types mapping here
Creating an encoder/decoder
The function passed to the snake_manager's erlport_encoder should be a main function containing everything you will setup further.
from erlport.erlang import set_decoder, set_encoder, set_message_handler from erlport.erlterms import Atom def main_encoder(): set_decoder(decoder_func) set_encoder(encoder_func) set_message_handler(cast_handler_func) return Atom("ok".encode("utf-8"))
An Encoder is a function that handles conversion PYTHON -> ELIXIR
Here is an example of encoding a simple class
While this is possible, a better way would be to handle them in a function that returns this type directly.
from dataclasses import dataclass from erlport.erlterms import Atom @dataclass class Cat: name: str color: str favorite_snacks: list[str] # By default erlport converts regular strings into charlists. # We can handle most of the cases by encoding strings into utf-8 with a simple function like this. def encode_basic_type_strings(data): if isinstance(data, str): return data.encode("utf-8") elif isinstance(data, list): return [encode_basic_type_strings(item) for item in data] elif isinstance(data, tuple): return tuple(encode_basic_type_strings(item) for item in data) elif isinstance(data, dict): return {key: encode_basic_type_strings(value) for key, value in data.items()} else: return data def encoder(value: any): if isinstance(value, Cat): # We .__dict__ the class and normalize it's key,values. # Erlport will convert this dict into a Map return { Atom(encode_basic_type_strings(key)): # Convert the keys to atoms encode_basic_type_strings(val) # utf-8 Encode strings inside for key, val in value.__dict__.items() } # If none matches we encode strings, and return return encode_basic_type_strings(value)
A decoder is a function that handles conversion ELIXIR -> PYTHON
Here is an example of decoding elixir's parameters
from erlport.erlterms import Atom, Map def decoder(value: any): # Elixir strings convert to bytes, we can decode them into utf-8 strings. if isinstance(value, bytes): return value.decode('utf-8') if isinstance(value, Map): # If its a Map custom type we decode bytes into utf-8 strings return { key.decode("utf-8"): [v.decode("utf-8") for v in val] for key, val in value.items() } # if none get caught we just return the raw inputs return value