From 702057023d9406dff459321269dd90cff04ce295 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Fri, 10 Nov 2023 22:54:29 +0100 Subject: [PATCH] Split out syndicate-schema-plugin --- Cargo.lock | 125 +++++++------- Cargo.toml | 1 + syndicate-schema-plugin/Cargo.toml | 19 +++ syndicate-schema-plugin/src/lib.rs | 3 + syndicate-schema-plugin/src/pattern_plugin.rs | 152 +++++++++++++++++ syndicate-server/Cargo.toml | 1 + syndicate-server/build.rs | 157 +----------------- 7 files changed, 244 insertions(+), 214 deletions(-) create mode 100644 syndicate-schema-plugin/Cargo.toml create mode 100644 syndicate-schema-plugin/src/lib.rs create mode 100644 syndicate-schema-plugin/src/pattern_plugin.rs diff --git a/Cargo.lock b/Cargo.lock index 564d07b..adad584 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -364,7 +364,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -566,9 +566,9 @@ checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "errno" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" +checksum = "7c18ee0ed65a5f1f81cac6b1d213b69c35fa47d4252ad41f1486dbd8226fe36e" dependencies = [ "libc", "windows-sys", @@ -713,7 +713,7 @@ checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -769,9 +769,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ "cfg-if 1.0.0", "libc", @@ -847,9 +847,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "f95b9abcae896730d42b78e09c155ed4ddf82c07b4de772c64aee5b2d8b7c150" dependencies = [ "bytes", "fnv", @@ -959,9 +959,9 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" dependencies = [ "wasm-bindgen", ] @@ -990,15 +990,15 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.149" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "linux-raw-sys" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" +checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" [[package]] name = "lock_api" @@ -1150,7 +1150,7 @@ dependencies = [ "aes-gcm", "blake2", "chacha20poly1305", - "getrandom 0.2.10", + "getrandom 0.2.11", "noise-protocol", "sha2", "x25519-dalek", @@ -1290,9 +1290,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.57" +version = "0.10.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c" +checksum = "7a257ad03cd8fb16ad4172fedf8094451e1af1c4b70097636ef2eac9a5f0cc33" dependencies = [ "bitflags 2.4.1", "cfg-if 1.0.0", @@ -1311,7 +1311,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1331,9 +1331,9 @@ dependencies = [ [[package]] name = "openssl-sys" -version = "0.9.93" +version = "0.9.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d" +checksum = "40a4130519a360279579c2053038317e40eff64d13fd3f004f9e1b72b8a6aaf9" dependencies = [ "cc", "libc", @@ -1390,7 +1390,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1470,9 +1470,9 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "preserves" -version = "4.991.1" +version = "4.992.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "810fa30267243c36473dce617d6e45ea9ed1b3e7987aa2969fcd22d946c29799" +checksum = "23d1499a990075d8c1aa3f6550da8a6d6542224c9375c6908f9325f757c38a7a" dependencies = [ "base64", "dtoa", @@ -1485,9 +1485,9 @@ dependencies = [ [[package]] name = "preserves-schema" -version = "4.991.0" +version = "4.992.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12225b6104827dc6d513f7f418cbe1fa9399a54f699c34d03eec706fb8fb41c0" +checksum = "664ffedfcc230ae69a43aecee85aee6d634be501f96928d12ec875e6d3d9533d" dependencies = [ "convert_case", "glob", @@ -1576,7 +1576,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.11", ] [[package]] @@ -1744,9 +1744,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.190" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] @@ -1772,13 +1772,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.190" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1845,9 +1845,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "socket2" @@ -1914,9 +1914,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.38" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" dependencies = [ "proc-macro2", "quote", @@ -1931,7 +1931,7 @@ dependencies = [ "bytes", "criterion", "futures", - "getrandom 0.2.10", + "getrandom 0.2.11", "hmac", "lazy_static", "openssl", @@ -1957,6 +1957,14 @@ dependencies = [ "tracing", ] +[[package]] +name = "syndicate-schema-plugin" +version = "0.1.0" +dependencies = [ + "preserves-schema", + "syndicate", +] + [[package]] name = "syndicate-server" version = "0.34.0" @@ -1971,6 +1979,7 @@ dependencies = [ "structopt", "syndicate", "syndicate-macros", + "syndicate-schema-plugin", "tikv-jemallocator", "tokio", "tokio-tungstenite", @@ -2032,7 +2041,7 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -2092,9 +2101,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.33.0" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ "backtrace", "bytes", @@ -2110,13 +2119,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -2165,7 +2174,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -2372,9 +2381,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -2382,24 +2391,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2407,28 +2416,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" dependencies = [ "js-sys", "wasm-bindgen", @@ -2590,5 +2599,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] diff --git a/Cargo.toml b/Cargo.toml index 75c7372..6096fb7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ cargo-features = ["strip"] members = [ "syndicate", "syndicate-macros", + "syndicate-schema-plugin", "syndicate-server", "syndicate-tools", ] diff --git a/syndicate-schema-plugin/Cargo.toml b/syndicate-schema-plugin/Cargo.toml new file mode 100644 index 0000000..94ddb33 --- /dev/null +++ b/syndicate-schema-plugin/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "syndicate-schema-plugin" +version = "0.1.0" +authors = ["Tony Garnock-Jones "] +edition = "2018" + +description = "Support for using Preserves Schema with Syndicate macros." +homepage = "https://syndicate-lang.org/" +repository = "https://git.syndicate-lang.org/syndicate-lang/syndicate-rs" +license = "Apache-2.0" + +[lib] + +[dependencies] +preserves-schema = "4.992.0" +syndicate = { path = "../syndicate", version = "0.30.0"} + +[package.metadata.workspaces] +independent = true diff --git a/syndicate-schema-plugin/src/lib.rs b/syndicate-schema-plugin/src/lib.rs new file mode 100644 index 0000000..af1c55f --- /dev/null +++ b/syndicate-schema-plugin/src/lib.rs @@ -0,0 +1,3 @@ +mod pattern_plugin; + +pub use pattern_plugin::PatternPlugin; diff --git a/syndicate-schema-plugin/src/pattern_plugin.rs b/syndicate-schema-plugin/src/pattern_plugin.rs new file mode 100644 index 0000000..bbe133d --- /dev/null +++ b/syndicate-schema-plugin/src/pattern_plugin.rs @@ -0,0 +1,152 @@ +use preserves_schema::*; +use preserves_schema::compiler::*; +use preserves_schema::compiler::context::ModuleContext; +use preserves_schema::gen::schema::*; +use preserves_schema::syntax::block::escape_string; +use preserves_schema::syntax::block::constructors::*; + +use std::iter::FromIterator; + +use syndicate::pattern::lift_literal; +use syndicate::schemas::dataspace_patterns as P; +use syndicate::value::IOValue; +use syndicate::value::Map; +use syndicate::value::NestedValue; + +#[derive(Debug)] +pub struct PatternPlugin; + +type WalkState<'a, 'm, 'b> = + preserves_schema::compiler::cycles::WalkState<&'a ModuleContext<'m, 'b>>; + +impl Plugin for PatternPlugin { + fn generate_definition( + &self, + ctxt: &mut ModuleContext, + definition_name: &str, + definition: &Definition, + ) { + if ctxt.mode == context::ModuleContextMode::TargetGeneric { + let mut s = WalkState::new(ctxt, ctxt.module_path.clone()); + if let Some(p) = definition.wc(&mut s) { + let v = syndicate::language().unparse(&p); + let v = preserves_schema::support::preserves::value::TextWriter::encode( + &mut preserves_schema::support::preserves::value::NoEmbeddedDomainCodec, + &v).unwrap(); + ctxt.define_type(item(seq![ + "impl ", definition_name.to_owned(), " ", codeblock![ + seq!["#[allow(unused)] pub fn wildcard_dataspace_pattern() ", + "-> syndicate::schemas::dataspace_patterns::Pattern ", + codeblock![ + "use syndicate::schemas::dataspace_patterns::*;", + "use preserves_schema::Codec;", + seq!["let _v = syndicate::value::text::from_str(", + escape_string(&v), + ", syndicate::value::ViaCodec::new(syndicate::value::NoEmbeddedDomainCodec)).unwrap();"], + "syndicate::language().parse(&_v).unwrap()"]]]])); + } + } + } +} + +fn discard() -> P::Pattern { + P::Pattern::DDiscard(Box::new(P::DDiscard)) +} + +trait WildcardPattern { + fn wc(&self, s: &mut WalkState) -> Option; +} + +impl WildcardPattern for Definition { + fn wc(&self, s: &mut WalkState) -> Option { + match self { + Definition::Or { .. } => None, + Definition::And { .. } => None, + Definition::Pattern(p) => p.wc(s), + } + } +} + +impl WildcardPattern for Pattern { + fn wc(&self, s: &mut WalkState) -> Option { + match self { + Pattern::CompoundPattern(p) => p.wc(s), + Pattern::SimplePattern(p) => p.wc(s), + } + } +} + +fn from_io(v: &IOValue) -> Option { + Some(v.value().copy_via(&mut |_| Err(())).ok()?.wrap()) +} + +impl WildcardPattern for CompoundPattern { + fn wc(&self, s: &mut WalkState) -> Option { + match self { + CompoundPattern::Tuple { patterns } => + Some(P::Pattern::DCompound(Box::new(P::DCompound::Arr { + items: patterns.iter() + .map(|p| unname(p).wc(s)) + .collect::>>()?, + }))), + CompoundPattern::TuplePrefix { .. } => + Some(discard()), + CompoundPattern::Dict { entries } => + Some(P::Pattern::DCompound(Box::new(P::DCompound::Dict { + entries: Map::from_iter( + entries.0.iter() + .map(|(k, p)| Some((from_io(k)?, unname_simple(p).wc(s)?))) + .filter(|e| discard() != e.as_ref().unwrap().1) + .collect::>>()? + .into_iter()), + }))), + CompoundPattern::Rec { label, fields } => match (unname(label), unname(fields)) { + (Pattern::SimplePattern(label), Pattern::CompoundPattern(fields)) => + match (*label, *fields) { + (SimplePattern::Lit { value }, CompoundPattern::Tuple { patterns }) => + Some(P::Pattern::DCompound(Box::new(P::DCompound::Rec { + label: from_io(&value)?, + fields: patterns.iter() + .map(|p| unname(p).wc(s)) + .collect::>>()?, + }))), + _ => None, + }, + _ => None, + }, + } + } +} + +impl WildcardPattern for SimplePattern { + fn wc(&self, s: &mut WalkState) -> Option { + match self { + SimplePattern::Any | + SimplePattern::Atom { .. } | + SimplePattern::Embedded { .. } | + SimplePattern::Seqof { .. } | + SimplePattern::Setof { .. } | + SimplePattern::Dictof { .. } => Some(discard()), + SimplePattern::Lit { value } => Some(lift_literal(&from_io(value)?)), + SimplePattern::Ref(r) => s.cycle_check( + r, + |ctxt, r| ctxt.bundle.lookup_definition(r).map(|v| v.0), + |s, d| d.and_then(|d| d.wc(s)).or_else(|| Some(discard())), + || Some(discard())), + } + } +} + +fn unname(np: &NamedPattern) -> Pattern { + match np { + NamedPattern::Anonymous(p) => (**p).clone(), + NamedPattern::Named(b) => Pattern::SimplePattern(Box::new(b.pattern.clone())), + } +} + +fn unname_simple(np: &NamedSimplePattern) -> &SimplePattern { + match np { + NamedSimplePattern::Anonymous(p) => p, + NamedSimplePattern::Named(b) => &b.pattern, + } +} diff --git a/syndicate-server/Cargo.toml b/syndicate-server/Cargo.toml index e014bd1..0b72324 100644 --- a/syndicate-server/Cargo.toml +++ b/syndicate-server/Cargo.toml @@ -15,6 +15,7 @@ jemalloc = ["dep:tikv-jemallocator"] [build-dependencies] preserves-schema = "4.991" syndicate = { path = "../syndicate", version = "0.30.0"} +syndicate-schema-plugin = { path = "../syndicate-schema-plugin", version = "0.1.0"} [dependencies] preserves-schema = "4.991" diff --git a/syndicate-server/build.rs b/syndicate-server/build.rs index 230f212..86a8730 100644 --- a/syndicate-server/build.rs +++ b/syndicate-server/build.rs @@ -1,160 +1,5 @@ use preserves_schema::compiler::*; -mod pattern_plugin { - use preserves_schema::*; - use preserves_schema::compiler::*; - use preserves_schema::compiler::context::ModuleContext; - use preserves_schema::gen::schema::*; - use preserves_schema::syntax::block::escape_string; - use preserves_schema::syntax::block::constructors::*; - - use std::iter::FromIterator; - - use syndicate::pattern::lift_literal; - use syndicate::schemas::dataspace_patterns as P; - use syndicate::value::IOValue; - use syndicate::value::Map; - use syndicate::value::NestedValue; - - #[derive(Debug)] - pub struct PatternPlugin; - - type WalkState<'a, 'm, 'b> = - preserves_schema::compiler::cycles::WalkState<&'a ModuleContext<'m, 'b>>; - - impl Plugin for PatternPlugin { - fn generate_definition( - &self, - ctxt: &mut ModuleContext, - definition_name: &str, - definition: &Definition, - ) { - if ctxt.mode == context::ModuleContextMode::TargetGeneric { - let mut s = WalkState::new(ctxt, ctxt.module_path.clone()); - if let Some(p) = definition.wc(&mut s) { - let v = syndicate::language().unparse(&p); - let v = preserves_schema::support::preserves::value::TextWriter::encode( - &mut preserves_schema::support::preserves::value::NoEmbeddedDomainCodec, - &v).unwrap(); - ctxt.define_type(item(seq![ - "impl ", definition_name.to_owned(), " ", codeblock![ - seq!["#[allow(unused)] pub fn wildcard_dataspace_pattern() ", - "-> syndicate::schemas::dataspace_patterns::Pattern ", - codeblock![ - "use syndicate::schemas::dataspace_patterns::*;", - "use preserves_schema::Codec;", - seq!["let _v = syndicate::value::text::from_str(", - escape_string(&v), - ", syndicate::value::ViaCodec::new(syndicate::value::NoEmbeddedDomainCodec)).unwrap();"], - "syndicate::language().parse(&_v).unwrap()"]]]])); - } - } - } - } - - fn discard() -> P::Pattern { - P::Pattern::DDiscard(Box::new(P::DDiscard)) - } - - trait WildcardPattern { - fn wc(&self, s: &mut WalkState) -> Option; - } - - impl WildcardPattern for Definition { - fn wc(&self, s: &mut WalkState) -> Option { - match self { - Definition::Or { .. } => None, - Definition::And { .. } => None, - Definition::Pattern(p) => p.wc(s), - } - } - } - - impl WildcardPattern for Pattern { - fn wc(&self, s: &mut WalkState) -> Option { - match self { - Pattern::CompoundPattern(p) => p.wc(s), - Pattern::SimplePattern(p) => p.wc(s), - } - } - } - - fn from_io(v: &IOValue) -> Option { - Some(v.value().copy_via(&mut |_| Err(())).ok()?.wrap()) - } - - impl WildcardPattern for CompoundPattern { - fn wc(&self, s: &mut WalkState) -> Option { - match self { - CompoundPattern::Tuple { patterns } => - Some(P::Pattern::DCompound(Box::new(P::DCompound::Arr { - items: patterns.iter() - .map(|p| unname(p).wc(s)) - .collect::>>()?, - }))), - CompoundPattern::TuplePrefix { .. } => - Some(discard()), - CompoundPattern::Dict { entries } => - Some(P::Pattern::DCompound(Box::new(P::DCompound::Dict { - entries: Map::from_iter( - entries.0.iter() - .map(|(k, p)| Some((from_io(k)?, unname_simple(p).wc(s)?))) - .filter(|e| discard() != e.as_ref().unwrap().1) - .collect::>>()? - .into_iter()), - }))), - CompoundPattern::Rec { label, fields } => match (unname(label), unname(fields)) { - (Pattern::SimplePattern(label), Pattern::CompoundPattern(fields)) => - match (*label, *fields) { - (SimplePattern::Lit { value }, CompoundPattern::Tuple { patterns }) => - Some(P::Pattern::DCompound(Box::new(P::DCompound::Rec { - label: from_io(&value)?, - fields: patterns.iter() - .map(|p| unname(p).wc(s)) - .collect::>>()?, - }))), - _ => None, - }, - _ => None, - }, - } - } - } - - impl WildcardPattern for SimplePattern { - fn wc(&self, s: &mut WalkState) -> Option { - match self { - SimplePattern::Any | - SimplePattern::Atom { .. } | - SimplePattern::Embedded { .. } | - SimplePattern::Seqof { .. } | - SimplePattern::Setof { .. } | - SimplePattern::Dictof { .. } => Some(discard()), - SimplePattern::Lit { value } => Some(lift_literal(&from_io(value)?)), - SimplePattern::Ref(r) => s.cycle_check( - r, - |ctxt, r| ctxt.bundle.lookup_definition(r).map(|v| v.0), - |s, d| d.and_then(|d| d.wc(s)).or_else(|| Some(discard())), - || Some(discard())), - } - } - } - - fn unname(np: &NamedPattern) -> Pattern { - match np { - NamedPattern::Anonymous(p) => (**p).clone(), - NamedPattern::Named(b) => Pattern::SimplePattern(Box::new(b.pattern.clone())), - } - } - - fn unname_simple(np: &NamedSimplePattern) -> &SimplePattern { - match np { - NamedSimplePattern::Anonymous(p) => p, - NamedSimplePattern::Named(b) => &b.pattern, - } - } -} - fn main() -> std::io::Result<()> { let buildroot = std::path::PathBuf::from(std::env::var_os("OUT_DIR").unwrap()); @@ -162,7 +7,7 @@ fn main() -> std::io::Result<()> { gen_dir.push("src/schemas"); let mut c = CompilerConfig::new(gen_dir, "crate::schemas".to_owned()); - c.plugins.push(Box::new(pattern_plugin::PatternPlugin)); + c.plugins.push(Box::new(syndicate_schema_plugin::PatternPlugin)); c.add_external_module(ExternalModule::new(vec!["EntityRef".to_owned()], "syndicate::actor")); c.add_external_module( ExternalModule::new(vec!["TransportAddress".to_owned()],