// this doesn't work, not sure what to do struct Foobar { is_foo: bool, number: uint, name: string, } enum Value { Null, Bool(bool), Integer(int), Float(float), String(String), Array(Vec), Object(Map), } fn serialize_ungeneric(f: Foobar, w: Write) { w.write(f"{\"is_foo\":"); w.write(f.bool.to_string()); w.write(f",\"number\":"); w.write(f.number.to_string()); w.write(f",\"name\":"); w.write(f.name); w.write(f"}"); } fn deserialize_ungeneric(v: Value) -> Foobar { let r = r.into(); let Value::Object(obj) = v else { panic("wanted an object"); }; Foobar { is_foo: obj.map.get("is_foo").unwrap().as_bool().unwrap(), number: obj.map.get("number").unwrap().as_int().unwrap(), name: obj.map.get("name").unwrap().as_str().unwrap(), } } fn serialize(data: T, w: Write) { match std::const::typeof::() { std::const::Type::Int(i) => w.write(i.to_string()), std::const::Type::Uint(u) => w.write(u.to_string()), std::const::Type::Float(f) => w.write(f.to_string()), std::const::Type::String(s) => w.write(f"\"{s}\""), std::const::Type::Boolean(b) => w.write(b.to_string()), std::const::Type::Vec => { w.write("["); for (idx, item) in data.enumerate() { serialize(item, w); if idx < fields.len() - 1 { w.write(","); } } w.write("]"); } std::const::Type::Struct(fields) => { w.write("{"); for (idx, field) in fields.enumerate() { let f = std::const::get_field(data, field); w.write("\"{name}\": "); serialize(f, w); if idx < fields.len() - 1 { w.write(","); } } w.write("}"); } _ => todo(), } } fn deserialize(v: Value) -> T { match (std::const::typeof::(), v) { (std::const::Type::Int, Value::Int(d) => d } }