diff --git a/Cargo.lock b/Cargo.lock index f24f18a..be45f79 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -81,9 +81,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.7.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" +checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" [[package]] name = "byteorder" @@ -631,9 +631,9 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "js-sys" -version = "0.3.53" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4bf49d50e2961077d9c99f4b7997d770a1114f087c3c2e0069b36c13fc2979d" +checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" dependencies = [ "wasm-bindgen", ] @@ -662,9 +662,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.101" +version = "0.2.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb00336871be5ed2c8ed44b60ae9959dc5b9f08539422ed43f09e34ecaeba21" +checksum = "a2a5ac8f984bfcf3a823267e5fde638acc3325f6496633a5da6bb6eb2171e103" [[package]] name = "log" @@ -1053,9 +1053,9 @@ checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "preserves" -version = "2.0.0-rc1" +version = "2.0.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e281800f60acacfaf49115f3032d3c9939a4eb4d6921cb280d7593744cada262" +checksum = "42ba391359a1e6d7c5a02911d6c684eec75acf8f25ba7057a8af7baa0182620f" dependencies = [ "base64", "dtoa", @@ -1067,9 +1067,9 @@ dependencies = [ [[package]] name = "preserves-schema" -version = "2.0.0-rc1" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "192e1fb003f58e76d60a70536deb6bc731ad9132ffb095ea31e7ecebaaf8de0e" +checksum = "f0612b3272f9d7c50e4ac8a8e04da1a7293117bac5268925cba25f82e79ebede" dependencies = [ "convert_case", "glob", @@ -1353,9 +1353,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.67" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7f9e390c27c3c0ce8bc5d725f6e4d30a29d26659494aa4b17535f7522c5c950" +checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8" dependencies = [ "itoa", "ryu", @@ -1377,9 +1377,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.9.6" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9204c41a1597a8c5af23c82d1c921cb01ec0a4c59e07a9c7306062829a3903f3" +checksum = "b69f9a4c9740d74c5baa3fd2e547f9525fa8088a8a958e0ca2409a514e33f5fa" dependencies = [ "block-buffer", "cfg-if 1.0.0", @@ -1532,18 +1532,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.28" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "283d5230e63df9608ac7d9691adc1dfb6e701225436eb64d0b9a7f0a5a04f6ec" +checksum = "602eca064b2d83369e2b2f34b09c70b605402801927c65c11071ac911d299b88" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.28" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa3884228611f5cd3608e2d409bf7dce832e4eb3135e3f11addbd7e41bd68e71" +checksum = "bad553cc2c78e8de258400763a647e80e6d1b31ee237275d756f6836d204494c" dependencies = [ "proc-macro2", "quote", @@ -1571,9 +1571,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848a1e1181b9f6753b5e96a092749e29b11d19ede67dfbbd6c7dc7e0f49b5338" +checksum = "5241dd6f21443a3606b432718b166d3cedc962fd4b8bea54a8bc7f514ebda986" dependencies = [ "tinyvec_macros", ] @@ -1641,9 +1641,9 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.26" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" +checksum = "84f96e095c0c82419687c20ddf5cb3eadb61f4e1405923c9dc8e53a1adacbda8" dependencies = [ "cfg-if 1.0.0", "pin-project-lite", @@ -1653,9 +1653,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" +checksum = "98863d0dd09fa59a1b79c6750ad80dbda6b75f4e71c437a6a1a8cb91a8bcbd77" dependencies = [ "proc-macro2", "quote", @@ -1664,9 +1664,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca517f43f0fb96e0c3072ed5c275fe5eece87e8cb52f4a77b69226d3b1c9df8" +checksum = "46125608c26121c81b0c6d693eab5a420e416da7e43c426d2e8f7df8da8a3acf" dependencies = [ "lazy_static", ] @@ -1704,9 +1704,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.2.20" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9cbe87a2fa7e35900ce5de20220a582a9483a7063811defce79d7cbd59d4cfe" +checksum = "56c42e73a9d277d4d2b6a88389a137ccf3c58599660b17e8f5fc39305e490669" dependencies = [ "ansi_term 0.12.1", "chrono", @@ -1774,9 +1774,9 @@ checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" [[package]] name = "unicode-width" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" [[package]] name = "unicode-xid" @@ -1839,9 +1839,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.76" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce9b1b516211d33767048e5d47fa2a381ed8b76fc48d2ce4aa39877f9f183e0" +checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -1849,9 +1849,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.76" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe8dc78e2326ba5f845f4b5bf548401604fa20b1dd1d365fb73b6c1d6364041" +checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" dependencies = [ "bumpalo", "lazy_static", @@ -1864,9 +1864,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.76" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44468aa53335841d9d6b6c023eaab07c0cd4bddbcfdee3e2bb1e8d2cb8069fef" +checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1874,9 +1874,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.76" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0195807922713af1e67dc66132c7328206ed9766af3858164fb583eedc25fbad" +checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" dependencies = [ "proc-macro2", "quote", @@ -1887,15 +1887,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.76" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdb075a845574a1fa5f09fd77e43f7747599301ea3417a9fbffdeedfc1f4a29" +checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" [[package]] name = "web-sys" -version = "0.3.53" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224b2f6b67919060055ef1a67807367c2066ed520c3862cc013d26cf893a783c" +checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/syndicate-server/Cargo.toml b/syndicate-server/Cargo.toml index 6cb577d..c5bfd25 100644 --- a/syndicate-server/Cargo.toml +++ b/syndicate-server/Cargo.toml @@ -10,10 +10,11 @@ repository = "https://git.syndicate-lang.org/syndicate-lang/syndicate-rs" license = "Apache-2.0" [build-dependencies] -preserves-schema = "2.0.0-rc1" +preserves-schema = "2.0.0-rc.3" +syndicate = { path = "../syndicate", version = "^0.12.0"} [dependencies] -preserves-schema = "2.0.0-rc1" +preserves-schema = "2.0.0-rc.3" syndicate = { path = "../syndicate", version = "^0.12.0"} syndicate-macros = { path = "../syndicate-macros", version = "^0.7.0"} diff --git a/syndicate-server/build.rs b/syndicate-server/build.rs index 806fdc4..96b6ad8 100644 --- a/syndicate-server/build.rs +++ b/syndicate-server/build.rs @@ -1,5 +1,175 @@ 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::schemas::dataspace_patterns as P; + use syndicate::value::IOValue; + use syndicate::value::Map; + use syndicate::value::NestedValue; + use syndicate::value::signed_integer::SignedInteger; + + #[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 { + ctor: Box::new(P::CArr { arity: patterns.len().into() }), + members: Map::from_iter( + patterns.iter().enumerate() + .map(|(i, p)| Some((i.into(), unname(p).wc(s)?))) + .filter(|e| discard() != e.as_ref().unwrap().1) + .collect::>>()? + .into_iter()), + }))), + CompoundPattern::TuplePrefix { .. } => + Some(discard()), + CompoundPattern::Dict { entries } => + Some(P::Pattern::DCompound(Box::new(P::DCompound::Dict { + ctor: Box::new(P::CDict), + members: 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 { + ctor: Box::new(P::CRec { + label: from_io(&value)?, + arity: patterns.len().into(), + }), + members: Map::from_iter( + patterns.iter().enumerate() + .map(|(i, p)| Some((i.into(), unname(p).wc(s)?))) + .filter(|e| discard() != e.as_ref().unwrap().1) + .collect::>>()? + .into_iter()), + }))), + _ => 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(P::Pattern::DLit(Box::new(P::DLit { + value: from_io(&value)?, + }))), + + SimplePattern::Ref(r) => s.cycle_check( + r, + |ctxt, r| ctxt.bundle.lookup_definition(r), + |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()); @@ -7,7 +177,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(syndicate_plugins::PatternPlugin)); + c.plugins.push(Box::new(pattern_plugin::PatternPlugin)); c.add_external_module(ExternalModule::new(vec!["EntityRef".to_owned()], "syndicate::actor")); c.add_external_module( ExternalModule::new(vec!["TransportAddress".to_owned()], diff --git a/syndicate-server/src/services/daemon.rs b/syndicate-server/src/services/daemon.rs index 36005b2..1d04966 100644 --- a/syndicate-server/src/services/daemon.rs +++ b/syndicate-server/src/services/daemon.rs @@ -1,47 +1,52 @@ -use std::convert::TryFrom; +use preserves_schema::Codec; + use std::sync::Arc; use syndicate::actor::*; -use syndicate::during::entity; -use syndicate::schemas::dataspace::Observe; use syndicate::supervise::{Supervisor, SupervisorConfiguration}; use syndicate::value::NestedValue; -use crate::schemas::external_services; +use crate::language::language; +use crate::schemas::external_services::DaemonService; use syndicate_macros::during; +// use syndicate::schemas::dataspace_patterns::*; +// impl DaemonService { +// fn wildcard_dataspace_pattern() -> Pattern { +// Pattern::DDiscard(Box::new(DDiscard)) +// } +// } + pub fn on_demand(t: &mut Activation, config_ds: Arc, root_ds: Arc) { - // t.spawn(syndicate::name!("on_demand", module = module_path!()), move |t| { + t.spawn(syndicate::name!("on_demand", module = module_path!()), move |t| { - // during!(t, config_ds, , |t| { - // let config_ds = Arc::clone(&config_ds); - // let root_ds = Arc::clone(&root_ds); - // Ok(Supervisor::start( - // t, - // syndicate::name!(parent: None, "daemon", service = ?spec_any), - // SupervisorConfiguration::default(), - // move |t| run(t, Arc::clone(&config_ds), Arc::clone(&root_ds), spec.clone()))) - // }); + during!(t, config_ds, language(), , |t| { + let config_ds = Arc::clone(&config_ds); + let root_ds = Arc::clone(&root_ds); + Ok(Supervisor::start( + t, + syndicate::name!(parent: None, "daemon", service = ?spec), + SupervisorConfiguration::default(), + move |t| run(t, Arc::clone(&config_ds), Arc::clone(&root_ds), spec.clone()))) + }); - // Ok(()) - // }); + Ok(()) + }); } -// fn run( -// t: &mut Activation, -// config_ds: Arc, -// _root_ds: Arc, -// captures: AnyValue, -// ) -> ActorResult { -// let spec = external_services::DaemonService::try_from(&from_any_value( -// &captures.value().to_sequence()?[0])?)?; -// { -// let spec = from_io_value(&spec)?; -// config_ds.assert(t, syndicate_macros::template!("")); -// } +fn run( + t: &mut Activation, + config_ds: Arc, + _root_ds: Arc, + captures: DaemonService, +) -> ActorResult { + { + let spec = language().unparse(&captures); + config_ds.assert(t, &(), &syndicate_macros::template!("")); + } -// tracing::info!("daemon {:?}", &spec); + tracing::info!("daemon {:?}", &captures); -// Ok(()) -// } + Ok(()) +} diff --git a/syndicate/Cargo.toml b/syndicate/Cargo.toml index c7c43d6..d88c693 100644 --- a/syndicate/Cargo.toml +++ b/syndicate/Cargo.toml @@ -13,11 +13,11 @@ license = "Apache-2.0" vendored-openssl = ["openssl/vendored"] [build-dependencies] -preserves-schema = "2.0.0-rc1" +preserves-schema = "2.0.0-rc.3" [dependencies] -preserves = "2.0.0-rc1" -preserves-schema = "2.0.0-rc1" +preserves = "2.0.0-rc.2" +preserves-schema = "2.0.0-rc.3" tokio = { version = "1.10", features = ["io-util", "macros", "rt", "rt-multi-thread", "time"] } tokio-util = "0.6"