Split out syndicate-schema-plugin
This commit is contained in:
parent
1f7930d31a
commit
702057023d
|
@ -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",
|
||||
]
|
||||
|
|
|
@ -4,6 +4,7 @@ cargo-features = ["strip"]
|
|||
members = [
|
||||
"syndicate",
|
||||
"syndicate-macros",
|
||||
"syndicate-schema-plugin",
|
||||
"syndicate-server",
|
||||
"syndicate-tools",
|
||||
]
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
[package]
|
||||
name = "syndicate-schema-plugin"
|
||||
version = "0.1.0"
|
||||
authors = ["Tony Garnock-Jones <tonyg@leastfixedpoint.com>"]
|
||||
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
|
|
@ -0,0 +1,3 @@
|
|||
mod pattern_plugin;
|
||||
|
||||
pub use pattern_plugin::PatternPlugin;
|
|
@ -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<P::Pattern>;
|
||||
}
|
||||
|
||||
impl WildcardPattern for Definition {
|
||||
fn wc(&self, s: &mut WalkState) -> Option<P::Pattern> {
|
||||
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<P::Pattern> {
|
||||
match self {
|
||||
Pattern::CompoundPattern(p) => p.wc(s),
|
||||
Pattern::SimplePattern(p) => p.wc(s),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn from_io(v: &IOValue) -> Option<P::_Any> {
|
||||
Some(v.value().copy_via(&mut |_| Err(())).ok()?.wrap())
|
||||
}
|
||||
|
||||
impl WildcardPattern for CompoundPattern {
|
||||
fn wc(&self, s: &mut WalkState) -> Option<P::Pattern> {
|
||||
match self {
|
||||
CompoundPattern::Tuple { patterns } =>
|
||||
Some(P::Pattern::DCompound(Box::new(P::DCompound::Arr {
|
||||
items: patterns.iter()
|
||||
.map(|p| unname(p).wc(s))
|
||||
.collect::<Option<Vec<P::Pattern>>>()?,
|
||||
}))),
|
||||
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::<Option<Vec<(P::_Any, P::Pattern)>>>()?
|
||||
.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::<Option<Vec<P::Pattern>>>()?,
|
||||
}))),
|
||||
_ => None,
|
||||
},
|
||||
_ => None,
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl WildcardPattern for SimplePattern {
|
||||
fn wc(&self, s: &mut WalkState) -> Option<P::Pattern> {
|
||||
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,
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
|
|
|
@ -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<P::Pattern>;
|
||||
}
|
||||
|
||||
impl WildcardPattern for Definition {
|
||||
fn wc(&self, s: &mut WalkState) -> Option<P::Pattern> {
|
||||
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<P::Pattern> {
|
||||
match self {
|
||||
Pattern::CompoundPattern(p) => p.wc(s),
|
||||
Pattern::SimplePattern(p) => p.wc(s),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn from_io(v: &IOValue) -> Option<P::_Any> {
|
||||
Some(v.value().copy_via(&mut |_| Err(())).ok()?.wrap())
|
||||
}
|
||||
|
||||
impl WildcardPattern for CompoundPattern {
|
||||
fn wc(&self, s: &mut WalkState) -> Option<P::Pattern> {
|
||||
match self {
|
||||
CompoundPattern::Tuple { patterns } =>
|
||||
Some(P::Pattern::DCompound(Box::new(P::DCompound::Arr {
|
||||
items: patterns.iter()
|
||||
.map(|p| unname(p).wc(s))
|
||||
.collect::<Option<Vec<P::Pattern>>>()?,
|
||||
}))),
|
||||
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::<Option<Vec<(P::_Any, P::Pattern)>>>()?
|
||||
.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::<Option<Vec<P::Pattern>>>()?,
|
||||
}))),
|
||||
_ => None,
|
||||
},
|
||||
_ => None,
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl WildcardPattern for SimplePattern {
|
||||
fn wc(&self, s: &mut WalkState) -> Option<P::Pattern> {
|
||||
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()],
|
||||
|
|
Loading…
Reference in New Issue