Skip to content

Instantly share code, notes, and snippets.

@mizchi
Created April 16, 2024 04:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mizchi/4ea1c2ee8b80aea063d247c9d22ad145 to your computer and use it in GitHub Desktop.
Save mizchi/4ea1c2ee8b80aea063d247c9d22ad145 to your computer and use it in GitHub Desktop.
pub trait ToJson {
write_json_string(Self, Buffer) -> Unit
}
fn ToJson::write_json_string(self : Int, buf : Buffer) -> Unit {
buf.write_string(self.to_string())
}
fn ToJson::write_json_string(self : Bool, buf : Buffer) -> Unit {
buf.write_string(self.to_string())
}
fn ToJson::write_json_string(self : String, buf : Buffer) -> Unit {
buf.write_string(self.to_string())
}
fn ToJson::write_json_string[T : ToJson](self : Array[T], buf : Buffer) -> Unit {
buf.write_string("[")
self.iteri(
fn(i, item) {
item.write_json_string(buf)
if i < self.length() - 1 {
buf.write_string(", ")
}
},
)
buf.write_string("]")
}
fn ToJson::write_json_string[T : ToJson](
self : @map.Map[String, T],
buf : Buffer
) -> Unit {
buf.write_string("{")
self.iteri(
fn(i, key, val) {
buf.write_string(key)
buf.write_string(": ")
val.write_json_string(buf)
buf.write_string(", ")
if i < self.size() - 1 {
buf.write_string(", ")
}
},
)
buf.write_string("}")
}
pub fn to_json[X : ToJson](x : X) -> String {
let buf = Buffer::make(10)
x.write_json_string(buf)
buf.to_string()
}
struct Data {
x : Int
y : Bool
z : String
} derive(Debug, Show)
// NOTE: this is imperfect. I need to get members by refrection
fn to_members(self : Data) -> Array[(String, ToJson)] {
[("x", self.x), ("y", self.y), ("z", self.z)]
}
fn Data::write_json_string(self : Data, buf : Buffer) -> Unit {
let members = to_members(self)
buf.write_string("{")
members.iteri(
fn(i, item) {
let (key, val) = item
buf.write_string(key)
buf.write_string(": ")
val.write_json_string(buf)
if i < members.length() - 1 {
buf.write_string(", ")
}
},
)
buf.write_string("}")
}
fn main {
// array
let x = [1, 2, 3]
println(to_json(x))
// map
let map : @map.Map[String, Int] = @map.Map::[("a", 1), ("b", 2), ("c", 3)]
println(to_json(map))
// custom data
let data : Data = { x: 1, y: true, z: "hello" }
let res3 = to_json(data)
println(res3)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment