https://hexdocs.pm/gserde/index.html
Don't want to write all the serializers and parsers for your models? Generate them.
It's very crude ATM, but hey--works-ish!
Demo from my actual project:
// src/model.gleam
// types ending in JSON get generated modules
pub type ModelJSON {
Model(
gimbal_url: Option(String),
connected: Bool,
history: List(String),
is_streaming: Bool,
manual_control_degrees: #(Int, Int),
)
}
Then, gleam run -m gserde. Then blamo, you get to_json(t), to_string(t), and from_string(json_string).
// src/model_json.gleam
import gleam/json
import gleam/dynamic
import model
pub fn to_json(t: model.ModelJSON) {
json.object([
#("gimbal_url", json.nullable(t.gimbal_url, json.string)),
#("connected", json.bool(t.connected)),
#("history", json.array(t.history, json.string)),
#("is_streaming", json.bool(t.is_streaming)),
#(
"manual_control_degrees",
json.preprocessed_array([
json.int(t.manual_control_degrees.0),
json.int(t.manual_control_degrees.1),
]),
),
])
}
pub fn to_string(t: model.ModelJSON) {
json.to_string(to_json(t))
}
pub fn from_json(json_str: String) {
json.decode(
json_str,
dynamic.decode5(
model.Model,
dynamic.field("gimbal_url", dynamic.optional(dynamic.string)),
dynamic.field("connected", dynamic.bool),
dynamic.field("history", dynamic.list(dynamic.string)),
dynamic.field("is_streaming", dynamic.bool),
dynamic.field(
"manual_control_degrees",
dynamic.tuple2(dynamic.int, dynamic.int),
),
),
)
}
again, not a super polished impl, and has macro shortcomings. something for another weekend (or your prs welcome) 🙂
gleam codegen for serialization and deserialization
