From 5a5199f91f6a256d02f94c6a16521378db2cf171 Mon Sep 17 00:00:00 2001 From: Nixon Enraght-Moony Date: Sat, 15 Jan 2022 22:16:52 +0000 Subject: [PATCH] Gah --- hidl/.gitignore | 1 + hidl/Cargo.lock | 153 ++++++++++++++++++++++++++++++++++++++ hidl/Cargo.toml | 13 ++++ hidl/spec-demo.yaml | 63 ++++++++++++++++ hidl/spec-testcosm.yaml | 89 ++++++++++++++++++++++ hidl/spec.yaml | 80 ++++++++++++++++++++ hidl/src/bin/demo.rs | 9 +++ hidl/src/bin/load.rs | 10 +++ hidl/src/lib.rs | 159 ++++++++++++++++++++++++++++++++++++++++ hidl/src/spec.rs | 87 ++++++++++++++++++++++ hidl/src/spec.yaml | 58 +++++++++++++++ 11 files changed, 722 insertions(+) create mode 100644 hidl/.gitignore create mode 100644 hidl/Cargo.lock create mode 100644 hidl/Cargo.toml create mode 100644 hidl/spec-demo.yaml create mode 100644 hidl/spec-testcosm.yaml create mode 100644 hidl/spec.yaml create mode 100644 hidl/src/bin/demo.rs create mode 100644 hidl/src/bin/load.rs create mode 100644 hidl/src/lib.rs create mode 100644 hidl/src/spec.rs create mode 100644 hidl/src/spec.yaml diff --git a/hidl/.gitignore b/hidl/.gitignore new file mode 100644 index 0000000..9f97022 --- /dev/null +++ b/hidl/.gitignore @@ -0,0 +1 @@ +target/ \ No newline at end of file diff --git a/hidl/Cargo.lock b/hidl/Cargo.lock new file mode 100644 index 0000000..7d56ffe --- /dev/null +++ b/hidl/Cargo.lock @@ -0,0 +1,153 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "debug2" +version = "0.1.0" +source = "git+https://github.com/aDotInTheVoid/debug2/#8b14afb90fc1d9ce470792ea393a9ab821a9e07f" +dependencies = [ + "debug2-derive", +] + +[[package]] +name = "debug2-derive" +version = "0.1.0" +source = "git+https://github.com/aDotInTheVoid/debug2/#8b14afb90fc1d9ce470792ea393a9ab821a9e07f" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + +[[package]] +name = "hidl" +version = "0.1.0" +dependencies = [ + "debug2", + "serde", + "serde_yaml", +] + +[[package]] +name = "indexmap" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" + +[[package]] +name = "proc-macro2" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47aa80447ce4daf1717500037052af176af5d38cc3e571d9ec1c7353fc10c87d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ryu" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" + +[[package]] +name = "serde" +version = "1.0.133" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97565067517b60e2d1ea8b268e59ce036de907ac523ad83a0475da04e818989a" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.133" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed201699328568d8d08208fdd080e3ff594e6c422e438b6705905da01005d537" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_yaml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a521f2940385c165a24ee286aa8599633d162077a54bdcae2a6fd5a7bfa7a0" +dependencies = [ + "indexmap", + "ryu", + "serde", + "yaml-rust", +] + +[[package]] +name = "syn" +version = "1.0.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a684ac3dcd8913827e18cd09a68384ee66c1de24157e3c556c9ab16d85695fb7" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] diff --git a/hidl/Cargo.toml b/hidl/Cargo.toml new file mode 100644 index 0000000..92cc553 --- /dev/null +++ b/hidl/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "hidl" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +debug2 = { git = "https://github.com/aDotInTheVoid/debug2/" } +serde = { version = "1.0.133", features = ["derive"] } +serde_yaml = "0.8.23" + +[features] diff --git a/hidl/spec-demo.yaml b/hidl/spec-demo.yaml new file mode 100644 index 0000000..5724f30 --- /dev/null +++ b/hidl/spec-demo.yaml @@ -0,0 +1,63 @@ +--- +name: hypercosm +root: + interfaces: + - name: object + version: + - 1 + - 0 + - 0 + methods: + - name: listInterfaces + ret: + Array: String + - name: release + - name: root + version: + - 0 + - 1 + - 0 + methods: + - name: listExtensions + ret: + Array: String + - name: ping + - name: getObjectById + ret: Object + args: + - - id + - Uuid + - name: getObjectByName + ret: Object + args: + - - name + - String +extenstions: + - name: assetdelivery + version: + - 0 + - 1 + - 0 + module: + interfaces: + - name: assetdelivery + version: + - 0 + - 1 + - 0 + events: + - name: loadAssets + args: + - - name + - String + types: + - name: asset + kind: + Struct: + fields: + - - id + - Uuid + - - name + - String + - - data + - Array: U8 diff --git a/hidl/spec-testcosm.yaml b/hidl/spec-testcosm.yaml new file mode 100644 index 0000000..fcb20e4 --- /dev/null +++ b/hidl/spec-testcosm.yaml @@ -0,0 +1,89 @@ +--- +- interface: + name: hypercosm.object.v1.0.0 + methods: + - listInterfaces: + - array[string] + - release + +- interface: + name: hypercosm.root.v0.1.0 + methods: + - listExtensions: + - array[string] + - ping + - getObjectById: + - object + - uuid: id + - getObjectByName: + - object + - string: name + +- extension: + - name: hypercosm.assetdelivery.v0.1.0 + - interface: # Implicit name; matches extension and visible from root object + events: # Events can come after methods in the YAML but always first for command numbering + - loadAssets: + - void + - array[asset]: asset + - unloadAssets: + - void + - array[uuid]: ids + methods: + - fetchAssetById: + - asset + - uuid: id + - fetchAssetByName: + - asset + - string: name + - fetchAssetsByIds: + - array[asset] + - array[uuid]: ids + - fetchAssetsByNames: + - array[asset] + - array[string]: names + - getId: + - uuid + - string: name + - struct: + - name: asset # First element of a struct is always the name + - uuid: id + - string: name + - array[u8]: data + +- extension: + - name: hypercosm.world.v0.1.0 + - interface: + events: + - addEntities: + - void + - array[entityInfo]: entities + - updateEntities: + - void + - array[entityInfo]: entities + - removeEntities: + - void + - array[entity]: entities + - struct: + - name: entityInfo + - uuid: assetId # glTF + - entity: entity + - matrix4x4: transformation + - entityFlags: flags + - interface: + name: entity + methods: + - interact + - flags: + - name: entityFlags + - type: vu128 + - None: 0 + - Interactable + - Collidable + + - enum: # Alternate form + - name: entityFlags + - type: vu128 + - None: 0 + - Interactable: 1 + - Collidable: 2 diff --git a/hidl/spec.yaml b/hidl/spec.yaml new file mode 100644 index 0000000..22de922 --- /dev/null +++ b/hidl/spec.yaml @@ -0,0 +1,80 @@ +--- +name: hypercosm +root: + + interfaces: + - name: object + version: + - 1 + - 0 + - 0 + methods: + - name: listInterfaces + ret: + Array: String + - name: release + + - name: root + version: + - 0 + - 1 + - 0 + methods: + - name: listExtensions + ret: + Array: String + - name: ping + - name: getObjectById + ret: Object + args: + - - id + - Uuid + - name: getObjectByName + ret: Object + args: + - - name + - String +extenstions: + - name: assetdelivery + version: + - 0 + - 1 + - 0 + module: + interfaces: + - name: assetdelivery + version: + - 0 + - 1 + - 0 + events: + - name: loadAssets + args: + - - assets + - Array: + Custom: + asset + - name: unloadAssets + args: + - - ids + - Array: Uuid + methods: + - name: fetchAssetByName + args: + - - name + - String + ret: + Custom: + asset + + types: + - name: asset + kind: + Struct: + fields: + - - id + - Uuid + - - name + - String + - - data + - Array: U8 diff --git a/hidl/src/bin/demo.rs b/hidl/src/bin/demo.rs new file mode 100644 index 0000000..5738da8 --- /dev/null +++ b/hidl/src/bin/demo.rs @@ -0,0 +1,9 @@ +use std::fs; + +fn main() { + let root = hidl::spec::spec(); + debug2::dbg!(&root); + let yaml_str = serde_yaml::to_string(&root).unwrap(); + eprintln!("{}", yaml_str); + fs::write("spec-demo.yaml", &yaml_str).unwrap(); +} diff --git a/hidl/src/bin/load.rs b/hidl/src/bin/load.rs new file mode 100644 index 0000000..5b2feb8 --- /dev/null +++ b/hidl/src/bin/load.rs @@ -0,0 +1,10 @@ +use std::fs; + +use hidl::IDL; + +fn main() { + let file = fs::read_to_string("spec.yaml").unwrap(); + let spec: IDL = serde_yaml::from_str(&file).unwrap(); + + debug2::dbg!(spec); +} diff --git a/hidl/src/lib.rs b/hidl/src/lib.rs new file mode 100644 index 0000000..27bb893 --- /dev/null +++ b/hidl/src/lib.rs @@ -0,0 +1,159 @@ +use debug2::Debug as Debug2; +use serde::{Deserialize, Serialize}; + +pub mod spec; + +#[derive(Debug, Debug2, Default, Clone, Serialize, Deserialize, PartialEq)] + +pub struct Module { + #[serde(default, skip_serializing_if = "is_default")] + interfaces: Vec, + #[serde(default, skip_serializing_if = "is_default")] + types: Vec, +} + +#[derive(Debug, Debug2, Default, Clone, Serialize, Deserialize, PartialEq)] + +pub struct IDL { + name: String, + root: Module, + #[serde(default, skip_serializing_if = "is_default")] + extenstions: Vec, +} + +#[derive(Debug, Debug2, Default, Clone, Serialize, Deserialize, PartialEq)] +pub struct Extension { + name: String, + version: Version, + module: Module, +} + +type Version = (u8, u8, u8); + +#[derive(Debug, Debug2, Default, Clone, Serialize, Deserialize, PartialEq)] +pub struct Interface { + name: String, + version: Version, + + #[serde(default, skip_serializing_if = "is_default")] + methods: Vec, + #[serde(default, skip_serializing_if = "is_default")] + events: Vec, +} + +#[derive(Debug, Debug2, Default, Clone, Serialize, Deserialize, PartialEq)] +pub struct Method { + name: String, + #[serde(default, skip_serializing_if = "is_default")] + ret: Type, + #[serde(default, skip_serializing_if = "is_default")] + args: Vec<(String, Type)>, +} + +#[derive(Debug, Debug2, Clone, Serialize, Deserialize, PartialEq)] +#[serde(untagged)] +pub enum Type { + NotIntType(NotIntType), + IntType(IntType), +} + +#[derive(Debug, Debug2, Clone, Serialize, Deserialize, PartialEq)] + +pub enum NotIntType { + /// TODO: Should we special case Array of u8? + Array(Box), + Custom(String), + String, + Object, + Uuid, + /// Unit type + Void, +} +impl Default for Type { + fn default() -> Self { + Self::NotIntType(NotIntType::Void) + } +} + +#[derive(Debug, Debug2, Clone, Serialize, Deserialize, PartialEq)] +pub enum IntType { + U8, + U16, + U32, + U64, + I8, + I16, + I32, + I64, + + VU16, + VU8, + VU32, + VU64, + VI8, + VI16, + VI32, + VI64, +} + +#[derive(Debug, Debug2, Clone, Serialize, Deserialize, PartialEq)] +pub struct CustomType { + name: String, + kind: CustomTypeKind, +} + +#[derive(Debug, Debug2, Clone, Serialize, Deserialize, PartialEq)] + +enum CustomTypeKind { + Struct(CustomStruct), + Enum(Enum), +} + +#[derive(Debug, Debug2, Clone, Serialize, Deserialize, PartialEq)] + +pub struct Enum { + storage: IntType, + values: Vec<(String, i64)>, +} + +#[derive(Debug, Debug2, Default, Clone, Serialize, Deserialize, PartialEq)] +pub struct CustomStruct { + fields: Vec<(String, Type)>, +} + +#[derive(Debug, Debug2, Default, Clone, Serialize, Deserialize, PartialEq)] +pub struct Event {} + +fn is_default(t: &T) -> bool { + t == &T::default() +} + +mod ty { + use super::IntType::*; + use super::NotIntType::*; + use super::Type::{self, *}; + + pub fn void() -> Type { + NotIntType(Void) + } + + pub fn array(t: Type) -> Type { + NotIntType(Array(Box::new(t))) + } + + pub fn string() -> Type { + NotIntType(String) + } + + pub fn object() -> Type { + NotIntType(Object) + } + + pub fn uuid() -> Type { + NotIntType(Uuid) + } + + pub fn u8() -> Type { + IntType(U8) + } +} diff --git a/hidl/src/spec.rs b/hidl/src/spec.rs new file mode 100644 index 0000000..adebb6e --- /dev/null +++ b/hidl/src/spec.rs @@ -0,0 +1,87 @@ +use crate::*; + +// TODO: Use autodefault when https://github.com/Lucretiel/autodefault/issues/4 +// is fixed + +pub fn spec() -> IDL { + IDL { + name: "hypercosm".to_owned(), + root: Module { + interfaces: vec![ + Interface { + name: "object".to_owned(), + version: (1, 0, 0), // TODO: Change + methods: vec![ + Method { + name: "listInterfaces".to_owned(), + args: vec![], + ret: ty::array(ty::string()), + }, + Method { + name: "release".to_owned(), + ..default() + }, + ], + ..default() + }, + Interface { + name: "root".to_owned(), + version: (0, 1, 0), + methods: vec![ + Method { + name: "listExtensions".to_owned(), + ret: ty::array(ty::string()), + ..default() + }, + Method { + name: "ping".to_owned(), + ..default() + }, + Method { + name: "getObjectById".to_owned(), + ret: ty::object(), + args: vec![("id".to_owned(), ty::uuid())], + }, + Method { + name: "getObjectByName".to_owned(), + ret: ty::object(), + args: vec![("name".to_owned(), ty::string())], + }, + ], + ..default() + }, + ], + ..default() + }, + extenstions: vec![Extension { + name: "assetdelivery".to_owned(), + version: (0, 1, 0), + module: Module { + interfaces: vec![Interface { + name: "assetdelivery".to_owned(), + version: (0, 1, 0), + events: vec![Method { + name: "loadAssets".to_owned(), + args: vec![("name".to_owned(), ty::string())], + ..default() + }], + ..default() + }], + types: vec![CustomType { + name: "asset".to_owned(), + kind: CustomTypeKind::Struct(CustomStruct { + fields: vec![ + ("id".to_owned(), ty::uuid()), + ("name".to_owned(), ty::string()), + ("data".to_owned(), ty::array(ty::u8())), + ], + }), + }], + }, + }], + } +} + +fn default() -> D { + Default::default() +} diff --git a/hidl/src/spec.yaml b/hidl/src/spec.yaml new file mode 100644 index 0000000..0187f16 --- /dev/null +++ b/hidl/src/spec.yaml @@ -0,0 +1,58 @@ +--- +name: hypercosm +root: + interfaces: + - name: object + version: + - 1 + - 0 + - 0 + methods: + - name: listInterfaces + ret: + Array: String + - name: release + - name: root + version: + - 0 + - 1 + - 0 + methods: + - name: listExtensions + ret: + Array: String + - name: ping + - name: getObjectById + ret: Object + args: + - - id + - Uuid + - name: getObjectByName + ret: Object + args: + - - name + - String +extenstions: + - name: assetdelivery + version: + - 0 + - 1 + - 0 + module: + interfaces: + - name: assetdelivery + version: + - 0 + - 0 + - 0 + types: + - name: asset + kind: + Struct: + fields: + - - id + - Uuid + - - name + - String + - - data + - Array: U8