dream_ets/encoders
Built-in encoders and decoders for common types
This module provides pre-built encoder and decoder functions for Gleam’s primitive types. These functions handle the conversion between Gleam types and Erlang’s dynamic types for ETS storage.
Quick Start
import dream_ets/config
import dream_ets/encoders
// Use convenience functions (recommended)
let assert Ok(table) = config.new("cache")
|> config.key_string()
|> config.value_string()
|> config.create()
// Or use encoders directly for custom configuration
let assert Ok(table) = config.new("scores")
|> config.key(encoders.string_encoder, encoders.string_decoder())
|> config.value(encoders.int_encoder, encoders.int_decoder())
|> config.create()
Built-in Types
This module provides encoders/decoders for:
String- Text dataInt- Integer numbersFloat- Floating-point numbersBool- Boolean values
Custom Types
For complex or custom types, you’ll need to write your own encoders/decoders. Common patterns:
JSON Encoding
import gleam/json
import gleam/dynamic
import gleam/result
pub type User {
User(name: String, age: Int)
}
fn encode_user(user: User) -> dynamic.Dynamic {
json.object([
#("name", json.string(user.name)),
#("age", json.int(user.age)),
])
|> json.to_string
|> dynamic.from
}
fn decode_user() -> decode.Decoder(User) {
use json_str <- decode.string
use obj <- decode.then(json.decode(json_str, decode.dynamic))
decode.decode2(
User,
decode.field("name", decode.string),
decode.field("age", decode.int),
)(obj)
}
Tuple Encoding
import gleam/dynamic
pub type Point {
Point(x: Int, y: Int)
}
fn encode_point(p: Point) -> dynamic.Dynamic {
dynamic.from(#(p.x, p.y))
}
fn decode_point() -> decode.Decoder(Point) {
decode.decode2(
Point,
decode.element(0, decode.int),
decode.element(1, decode.int),
)
}
Values
pub fn bool_decoder() -> decode.Decoder(Bool)
Decode a boolean from Dynamic
Converts an Erlang dynamic type back to a Gleam Bool.
Returns
A decoder that converts Dynamic values to Bool.
Example
import dream_ets/config
import dream_ets/encoders
let assert Ok(flags) = config.new("flags")
|> config.key_string()
|> config.value(encoders.bool_encoder, encoders.bool_decoder())
|> config.create()
See Also
bool_encoder()- Encode booleans for storage
pub fn bool_encoder(b: Bool) -> dynamic.Dynamic
Encode a boolean to Dynamic
Converts a Gleam Bool to Erlang’s dynamic type for storage in ETS.
Parameters
b: The boolean to encode
Returns
A Dynamic value representing the boolean.
Example
import dream_ets/config
import dream_ets/encoders
// Feature flags table
let assert Ok(flags) = config.new("feature_flags")
|> config.key_string()
|> config.value(encoders.bool_encoder, encoders.bool_decoder())
|> config.create()
See Also
bool_decoder()- Decode booleans from storage
pub fn float_decoder() -> decode.Decoder(Float)
Decode a float from Dynamic
Converts an Erlang dynamic type back to a Gleam Float.
Returns
A decoder that converts Dynamic values to Float.
Example
import dream_ets/config
import dream_ets/encoders
let assert Ok(metrics) = config.new("latency")
|> config.key_string()
|> config.value(encoders.float_encoder, encoders.float_decoder())
|> config.create()
See Also
float_encoder()- Encode floats for storage
pub fn float_encoder(f: Float) -> dynamic.Dynamic
Encode a float to Dynamic
Converts a Gleam Float to Erlang’s dynamic type for storage in ETS.
Parameters
f: The float to encode
Returns
A Dynamic value representing the float.
Example
import dream_ets/config
import dream_ets/encoders
// Prices table with float values
let assert Ok(prices) = config.new("product_prices")
|> config.key_string()
|> config.value(encoders.float_encoder, encoders.float_decoder())
|> config.create()
See Also
float_decoder()- Decode floats from storage
pub fn int_decoder() -> decode.Decoder(Int)
Decode an integer from Dynamic
Converts an Erlang dynamic type back to a Gleam Int.
Returns
A decoder that converts Dynamic values to Int.
Example
import dream_ets/config
import dream_ets/encoders
let assert Ok(table) = config.new("scores")
|> config.key_string()
|> config.value(encoders.int_encoder, encoders.int_decoder())
|> config.create()
See Also
int_encoder()- Encode integers for storage
pub fn int_encoder(i: Int) -> dynamic.Dynamic
Encode an integer to Dynamic
Converts a Gleam Int to Erlang’s dynamic type for storage in ETS.
Parameters
i: The integer to encode
Returns
A Dynamic value representing the integer.
Example
import dream_ets/config
import dream_ets/encoders
// Counter table with int values
let assert Ok(counter) = config.new("counts")
|> config.key_string()
|> config.value(encoders.int_encoder, encoders.int_decoder())
|> config.create()
See Also
int_decoder()- Decode integers from storageconfig.counter()- Convenience for counter tables
pub fn string_decoder() -> decode.Decoder(String)
Decode a string from Dynamic
Converts an Erlang dynamic type back to a Gleam String.
Returns
A decoder that converts Dynamic values to String.
Example
import dream_ets/config
import dream_ets/encoders
let assert Ok(table) = config.new("users")
|> config.key_string()
|> config.value(encoders.string_encoder, encoders.string_decoder())
|> config.create()
See Also
string_encoder()- Encode strings for storageconfig.value_string()- Convenience function for string values
pub fn string_encoder(s: String) -> dynamic.Dynamic
Encode a string to Dynamic
Converts a Gleam String to Erlang’s dynamic type for storage in ETS.
Parameters
s: The string to encode
Returns
A Dynamic value representing the string.
Example
import dream_ets/config
import dream_ets/encoders
let assert Ok(table) = config.new("cache")
|> config.key(encoders.string_encoder, encoders.string_decoder())
|> config.value_string()
|> config.create()
See Also
string_decoder()- Decode strings from storageconfig.key_string()- Convenience function for string keys