45 lines
1.2 KiB
Text
45 lines
1.2 KiB
Text
|
// this version uses types as values
|
||
|
// every version i tried to make feels oddly hacky, unsure what to do
|
||
|
|
||
|
fn serialize(data: Any, w: Write) {
|
||
|
match std::const::type_info(std::const::type_of(data)) {
|
||
|
.int => w.write(data.to_string()),
|
||
|
.float => w.write(data.to_string()),
|
||
|
.bool => w.write(data.to_string()),
|
||
|
.enum => todo(),
|
||
|
.struct(s) => {
|
||
|
w.write("{");
|
||
|
for field in s.fields {
|
||
|
let d = std::const::get_struct_field(s, field.name);
|
||
|
w.write(f"\"{field.name}\":{d}");
|
||
|
}
|
||
|
w.write("}");
|
||
|
}
|
||
|
_ => todo(),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn deserialize(into: type, json: Value) -> into {
|
||
|
match (std::const::type_info(into), json) {
|
||
|
(.int, .int(i)) => i,
|
||
|
(.float, .float(f)) => f,
|
||
|
(.bool, .bool(b)) => b,
|
||
|
(.struct(s), .map(m)) => {
|
||
|
let s = std::mem::uninit(into);
|
||
|
for field in s.fields {
|
||
|
s.set_field(field.name, m.get(field.name).expect("missing field!")).expect("wrong type!");
|
||
|
}
|
||
|
unsafe { s.assume_init() }
|
||
|
},
|
||
|
(_, _) => todo(),
|
||
|
// (_, _) => panic("expected {into} but got {json.type_name()}"),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// in std
|
||
|
mod const {
|
||
|
pub const fn type_of(data: Any) -> type;
|
||
|
pub const fn type_info(ty: type) -> TypeInfo;
|
||
|
pub const fn get_struct_field(data: struct, name: String) -> /* type of data.name */;
|
||
|
}
|