aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/Cargo.toml2
-rw-r--r--common/object/Cargo.toml4
-rw-r--r--common/object/src/json.rs52
-rw-r--r--common/object/src/lib.rs3
-rw-r--r--common/object/src/registry.rs1
5 files changed, 61 insertions, 1 deletions
diff --git a/common/Cargo.toml b/common/Cargo.toml
index 1d7d0a8..4eae9f8 100644
--- a/common/Cargo.toml
+++ b/common/Cargo.toml
@@ -5,4 +5,4 @@ edition = "2024"
[dependencies]
jellystream-types = { path = "../stream/types" }
-jellyobject = { path = "object" }
+jellyobject = { path = "object", features = ["json"] }
diff --git a/common/object/Cargo.toml b/common/object/Cargo.toml
index a5825ee..2c27c5e 100644
--- a/common/object/Cargo.toml
+++ b/common/object/Cargo.toml
@@ -6,3 +6,7 @@ edition = "2024"
[dependencies]
bytemuck = { version = "1.24.0", features = ["extern_crate_std"] }
log = "0.4.29"
+serde_json = { version = "1.0.149", optional = true }
+
+[features]
+json = ["dep:serde_json"]
diff --git a/common/object/src/json.rs b/common/object/src/json.rs
new file mode 100644
index 0000000..e8b04ea
--- /dev/null
+++ b/common/object/src/json.rs
@@ -0,0 +1,52 @@
+/*
+ This file is part of jellything (https://codeberg.org/metamuffin/jellything)
+ which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
+ Copyright (C) 2026 metamuffin <metamuffin.org>
+*/
+
+use crate::{Object, Registry, types::*};
+use serde_json::{Map, Value};
+
+pub fn object_to_json(reg: &Registry, ob: Object<'_>) -> Value {
+ eprintln!("{ob:#?}");
+ let mut o = Map::new();
+ let mut nonexhaustive = false;
+ for (i, tag) in ob.keys().enumerate() {
+ let Some(info) = reg.info(tag) else {
+ nonexhaustive = true;
+ continue;
+ };
+ let Some(ty) = info.r#type else {
+ nonexhaustive = true;
+ continue;
+ };
+ let key = info.name.to_string();
+
+ match ty {
+ x if x == STR => {
+ o.insert(key, ob.get_typed::<&str>(i).unwrap().to_string().into());
+ }
+ x if x == OBJECT => {
+ eprintln!("{key}");
+ o.insert(key, object_to_json(reg, ob.get_typed::<Object>(i).unwrap()));
+ }
+ x if x == U32 => {
+ o.insert(key, ob.get_typed::<u32>(i).unwrap().to_string().into());
+ }
+ x if x == U64 => {
+ o.insert(key, ob.get_typed::<u64>(i).unwrap().to_string().into());
+ }
+ x if x == F64 => {
+ o.insert(key, ob.get_typed::<f64>(i).unwrap().to_string().into());
+ }
+ _ => {
+ nonexhaustive = true;
+ }
+ };
+ }
+ if nonexhaustive {
+ o.insert("_nonexhaustive".to_owned(), Value::Bool(true));
+ }
+
+ Value::Object(o)
+}
diff --git a/common/object/src/lib.rs b/common/object/src/lib.rs
index 0eb11fd..9af4f85 100644
--- a/common/object/src/lib.rs
+++ b/common/object/src/lib.rs
@@ -7,11 +7,14 @@
mod buffer;
pub mod inspect;
+#[cfg(feature = "json")]
+pub mod json;
mod path;
mod registry;
#[cfg(test)]
mod tests;
mod value;
+
pub use buffer::*;
pub use path::*;
pub use registry::*;
diff --git a/common/object/src/registry.rs b/common/object/src/registry.rs
index 85d3ff2..f3ed7df 100644
--- a/common/object/src/registry.rs
+++ b/common/object/src/registry.rs
@@ -16,6 +16,7 @@ pub mod types {
pub const BINARY: TypeId = TypeId::of::<&[u8]>();
pub const U32: TypeId = TypeId::of::<u32>();
pub const U64: TypeId = TypeId::of::<u64>();
+ pub const F64: TypeId = TypeId::of::<f64>();
}
#[derive(Default, Clone)]