diff --git a/Cargo.lock b/Cargo.lock index 7835fc0..c1ac24f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,19 +4,13 @@ version = 4 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "adler2" version = "2.0.0" @@ -112,6 +106,17 @@ dependencies = [ "serde_json", ] +[[package]] +name = "async-trait" +version = "0.1.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "autocfg" version = "1.4.0" @@ -120,17 +125,17 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", - "miniz_oxide 0.7.4", + "miniz_oxide", "object", "rustc-demangle", + "windows-targets", ] [[package]] @@ -170,10 +175,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] -name = "bytes" -version = "1.9.0" +name = "block-buffer" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bytes" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" dependencies = [ "serde", ] @@ -189,9 +203,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.10" +version = "1.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" +checksum = "c7777341816418c02e033934a09f20dc0ccaf65a5201ef8a450ae0105a573fda" dependencies = [ "shlex", ] @@ -204,9 +218,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.5.27" +version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" +checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff" dependencies = [ "clap_builder", "clap_derive", @@ -226,9 +240,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.24" +version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" +checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" dependencies = [ "heck", "proc-macro2", @@ -248,6 +262,15 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.4.2" @@ -257,6 +280,16 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "deranged" version = "0.3.11" @@ -266,6 +299,16 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "either" version = "1.13.0" @@ -288,6 +331,16 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "filesystem-trustfall-adapter" +version = "0.1.1" +dependencies = [ + "serde", + "serde_json", + "sha256", + "trustfall", +] + [[package]] name = "flate2" version = "1.0.35" @@ -295,7 +348,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", - "miniz_oxide 0.8.3", + "miniz_oxide", ] [[package]] @@ -394,21 +447,32 @@ dependencies = [ ] [[package]] -name = "getrandom" -version = "0.2.15" +name = "generic-array" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets", ] [[package]] name = "gimli" -version = "0.28.1" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "hashbrown" @@ -422,6 +486,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "human-panic" version = "2.0.2" @@ -478,9 +548,9 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jiff" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c607c728e28764fecde611a2764a3a5db19ae21dcec46f292244f5cc5c085a81" +checksum = "c04ef77ae73f3cf50510712722f0c4e8b46f5aaa1bf5ffad2ae213e6495e78e5" dependencies = [ "jiff-tzdb-platform", "log", @@ -580,9 +650,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "miette" -version = "7.4.0" +version = "7.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317f146e2eb7021892722af37cf1b971f0a70c8406f487e24952667616192c64" +checksum = "1a955165f87b37fd1862df2a59547ac542c77ef6d17c666f619d1ad22dd89484" dependencies = [ "backtrace", "backtrace-ext", @@ -601,24 +671,15 @@ dependencies = [ [[package]] name = "miette-derive" -version = "7.4.0" +version = "7.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c9b935fbe1d6cbd1dac857b54a688145e2d93f48db36010514d0f612d0ad67" +checksum = "bf45bf44ab49be92fd1227a3be6fc6f617f1a337c06af54981048574d8783147" dependencies = [ "proc-macro2", "quote", "syn", ] -[[package]] -name = "miniz_oxide" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", -] - [[package]] name = "miniz_oxide" version = "0.8.3" @@ -635,7 +696,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -730,18 +791,18 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.2" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" [[package]] name = "onig" @@ -846,6 +907,7 @@ version = "0.1.0" dependencies = [ "camino", "clap", + "filesystem-trustfall-adapter", "futures", "human-panic", "jiff", @@ -994,9 +1056,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "same-file" @@ -1035,9 +1097,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.137" +version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" +checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" dependencies = [ "itoa", "memchr", @@ -1054,6 +1116,30 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha256" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18278f6a914fa3070aa316493f7d2ddfb9ac86ebc06fa3b83bffda487e9065b0" +dependencies = [ + "async-trait", + "bytes", + "hex", + "sha2", + "tokio", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -1135,9 +1221,9 @@ checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" [[package]] name = "syn" -version = "2.0.96" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -1323,9 +1409,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" dependencies = [ "serde", "serde_spanned", @@ -1454,6 +1540,12 @@ dependencies = [ "syn", ] +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + [[package]] name = "ucd-trie" version = "0.1.7" @@ -1486,9 +1578,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.12.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" +checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0" dependencies = [ "getrandom", ] @@ -1499,6 +1591,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + [[package]] name = "walkdir" version = "2.5.0" @@ -1515,6 +1613,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "winapi" version = "0.3.9" @@ -1630,13 +1737,22 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.25" +version = "0.6.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad699df48212c6cc6eb4435f35500ac6fd3b9913324f938aea302022ce19d310" +checksum = "1e90edd2ac1aa278a5c4599b1d89cf03074b610800f866d4026dc199d7929a28" dependencies = [ "memchr", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.8.0", +] + [[package]] name = "yaml-rust" version = "0.4.5" diff --git a/crates/plaixt/Cargo.toml b/crates/plaixt/Cargo.toml index e2aead9..610df66 100644 --- a/crates/plaixt/Cargo.toml +++ b/crates/plaixt/Cargo.toml @@ -8,6 +8,7 @@ license.workspace = true [dependencies] camino = { version = "1.1.9", features = ["serde", "serde1"] } clap = { version = "4.5.27", features = ["derive"] } +filesystem-trustfall-adapter = { version = "0.1.1", path = "../../../trustfall-adapters-zimbopro/filesystem-trustfall-adapter" } futures = "0.3.31" human-panic = "2.0.2" jiff = "0.1.28" diff --git a/crates/plaixt/src/main.rs b/crates/plaixt/src/main.rs index 9611dee..c64aa27 100644 --- a/crates/plaixt/src/main.rs +++ b/crates/plaixt/src/main.rs @@ -8,8 +8,10 @@ use camino::Utf8PathBuf; use clap::Parser; use clap::Subcommand; use clap::ValueHint; +use filesystem_trustfall_adapter::FileSystemAdapter; use human_panic::Metadata; use miette::IntoDiagnostic; +use parsing::Definition; use parsing::Record; use tracing::info; use tracing_subscriber::EnvFilter; @@ -64,7 +66,7 @@ async fn main() -> miette::Result<()> { let records = parsing::load_records(root_folder, &definitions).await?; - let schema = trustfall_plaixt::to_schema(&definitions); + let (schema, adapter) = get_schema_and_adapter(&definitions, records.clone()); match args.mode { ArgMode::Query => { @@ -75,13 +77,9 @@ async fn main() -> miette::Result<()> { let result = execute_query( &schema, - Arc::new(trustfall_plaixt::TrustfallMultiAdapter { - plaixt: trustfall_plaixt::PlaixtAdapter { - records: records.clone(), - }, - }), + Arc::new(adapter), &query, - BTreeMap::, FieldValue>::from([("search".into(), "trust".into())]), + BTreeMap::, FieldValue>::from([]), ) .unwrap() .collect::>(); @@ -96,6 +94,20 @@ async fn main() -> miette::Result<()> { Ok(()) } +fn get_schema_and_adapter( + definitions: &BTreeMap>, + records: Vec, +) -> (trustfall::Schema, trustfall_plaixt::TrustfallMultiAdapter) { + let schema = trustfall_plaixt::to_schema(definitions); + let adapter = trustfall_plaixt::TrustfallMultiAdapter { + plaixt: trustfall_plaixt::PlaixtAdapter { + records: records.clone(), + }, + filesystem: FileSystemAdapter::new(), + }; + (schema, adapter) +} + fn print_records(records: &[Record]) { for record in records { println!("{kind} @ {at} {{", kind = record.kind, at = record.at); @@ -105,3 +117,37 @@ fn print_records(records: &[Record]) { println!("}}") } } + +#[cfg(test)] +mod tests { + use camino::Utf8PathBuf; + use tracing_subscriber::EnvFilter; + use trustfall::provider::check_adapter_invariants; + + use crate::get_schema_and_adapter; + use crate::parsing; + + #[tokio::test] + async fn ensure_adapter_satisfies_invariants() { + tracing_subscriber::fmt() + .with_env_filter(EnvFilter::from_default_env()) + .pretty() + .with_test_writer() + .init(); + + let root_folder = Utf8PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../examples"); + + println!("{root_folder}"); + let definitions = parsing::load_definitions(&root_folder.join("definitions")) + .await + .unwrap(); + + let records = parsing::load_records(&root_folder, &definitions) + .await + .unwrap(); + + let (schema, adapter) = get_schema_and_adapter(&definitions, records.clone()); + + check_adapter_invariants(&schema, adapter); + } +} diff --git a/crates/plaixt/src/parsing.rs b/crates/plaixt/src/parsing.rs index df05113..243dd61 100644 --- a/crates/plaixt/src/parsing.rs +++ b/crates/plaixt/src/parsing.rs @@ -15,6 +15,8 @@ use miette::NamedSource; use owo_colors::OwoColorize; use tokio_stream::wrappers::ReadDirStream; +use crate::trustfall_plaixt::ADAPTER_SEP; + #[derive(Debug, Clone)] pub struct Record { pub(crate) kind: String, @@ -156,6 +158,7 @@ pub(crate) async fn load_records( #[derive(Debug)] pub enum DefinitionKind { String, + Path, OneOf(Vec), } @@ -163,6 +166,7 @@ impl DefinitionKind { pub(crate) fn trustfall_kind(&self) -> String { match self { DefinitionKind::String => String::from("String"), + DefinitionKind::Path => format!("fs{ADAPTER_SEP}Path"), DefinitionKind::OneOf(_vecs) => String::from("String"), } } @@ -173,6 +177,10 @@ impl DefinitionKind { .is_string() .then_some(()) .ok_or("Expected a string here".to_string()), + DefinitionKind::Path => val + .is_string() + .then_some(()) + .ok_or("Expected a path encoded as a string here".to_string()), DefinitionKind::OneOf(options) => val .as_string() .is_some_and(|val| options.iter().any(|o| o == val)) @@ -187,6 +195,7 @@ impl TryFrom<&str> for DefinitionKind { fn try_from(value: &str) -> Result { match value.to_ascii_lowercase().as_str() { "string" => Ok(DefinitionKind::String), + "path" => Ok(DefinitionKind::Path), other => miette::bail!("Did not recognize valid field kind: \"{other}\""), } } diff --git a/crates/plaixt/src/trustfall_plaixt.rs b/crates/plaixt/src/trustfall_plaixt.rs index 422962b..7e95369 100644 --- a/crates/plaixt/src/trustfall_plaixt.rs +++ b/crates/plaixt/src/trustfall_plaixt.rs @@ -19,7 +19,7 @@ use trustfall::Schema; use crate::parsing::Definition; use crate::parsing::Record; -const ADAPTER_SEP: &str = "__"; +pub(crate) const ADAPTER_SEP: &str = "__"; #[derive(Debug, Default)] pub struct StartingVertex { @@ -155,12 +155,29 @@ pub(crate) fn to_schema(definitions: &BTreeMap>) -> Sche {} type RootSchemaQuery {{ {roots} + fs{ADAPTER_SEP}Path(path: String!): fs{ADAPTER_SEP}Path!, }} interface Record {{ at: String!, kind: String!, }} + interface fs{ADAPTER_SEP}Path {{ + path: String! + }} + + type fs{ADAPTER_SEP}Folder implements fs{ADAPTER_SEP}Path {{ + path: String! + children: [fs{ADAPTER_SEP}Path!] + }} + + type fs{ADAPTER_SEP}File implements fs{ADAPTER_SEP}Path {{ + path: String! + size: Int! + extension: String! + Hash: String! + }} + {types} "#, Schema::ALL_DIRECTIVE_DEFINITIONS, @@ -179,11 +196,23 @@ pub(crate) fn to_schema(definitions: &BTreeMap>) -> Sche pub struct TrustfallMultiAdapter { pub plaixt: PlaixtAdapter, + pub filesystem: filesystem_trustfall_adapter::FileSystemAdapter, } #[derive(Debug, Clone)] pub enum TrustfallMultiVertex { Plaixt(PlaixtVertex), + Filesystem(filesystem_trustfall_adapter::vertex::Vertex), +} + +impl AsVertex for TrustfallMultiVertex { + fn as_vertex(&self) -> Option<&filesystem_trustfall_adapter::vertex::Vertex> { + self.as_filesystem() + } + + fn into_vertex(self) -> Option { + self.as_filesystem().cloned() + } } impl AsVertex for TrustfallMultiVertex { @@ -204,6 +233,20 @@ impl TrustfallMultiVertex { None } } + + pub fn as_filesystem( + &self, + ) -> Option< + &>::Vertex, + > { + if let Self::Filesystem(v) = self { + Some(v) + } else { + None + } + } } impl<'v> Adapter<'v> for TrustfallMultiAdapter { @@ -217,7 +260,11 @@ impl<'v> Adapter<'v> for TrustfallMultiAdapter { ) -> trustfall::provider::VertexIterator<'v, Self::Vertex> { let (adapter_name, edge_name) = edge_name.split_once(ADAPTER_SEP).unwrap(); - trace!(?adapter_name, ?edge_name, "Got start vertex"); + trace!( + ?adapter_name, + ?edge_name, + "resolving top-level starting vertex" + ); match adapter_name { "Plaixt" => { @@ -229,6 +276,18 @@ impl<'v> Adapter<'v> for TrustfallMultiAdapter { Box::new(iter.map(TrustfallMultiVertex::Plaixt)) } + "fs" => { + let iter = self.filesystem.resolve_starting_vertices( + &Arc::from(edge_name), + parameters, + resolve_info, + ); + + Box::new( + iter.inspect(|v| trace!(?v, "Got vertex")) + .map(TrustfallMultiVertex::Filesystem), + ) + } _ => unreachable!(), } } @@ -243,7 +302,10 @@ impl<'v> Adapter<'v> for TrustfallMultiAdapter { where V: trustfall::provider::AsVertex + 'v, { - let (adapter_name, type_name) = type_name.split_once(ADAPTER_SEP).unwrap(); + trace!(?type_name, ?property_name, "resolving top-level property"); + let (adapter_name, type_name) = type_name + .split_once(ADAPTER_SEP) + .unwrap_or(("Plaixt", type_name)); match adapter_name { "Plaixt" => { @@ -268,6 +330,29 @@ impl<'v> Adapter<'v> for TrustfallMultiAdapter { .map(|((_ctx, name), og_ctx)| (og_ctx, name)), ) } + "fs" => { + let contexts = contexts.collect::>(); + + let properties = self.filesystem.resolve_property( + Box::new( + contexts + .clone() + .into_iter() + .map(|v| v.flat_map(&mut |v: V| v.into_vertex())) + .inspect(|v| trace!(?v, "Got vertex")), + ), + &Arc::from(type_name), + property_name, + resolve_info, + ); + + Box::new( + properties + .into_iter() + .zip(contexts) + .map(|((_ctx, name), og_ctx)| (og_ctx, name)), + ) + } _ => unreachable!(), } } @@ -284,6 +369,7 @@ impl<'v> Adapter<'v> for TrustfallMultiAdapter { V, trustfall::provider::VertexIterator<'v, Self::Vertex>, > { + trace!(?type_name, ?edge_name, "Resolving top-level neighbor"); let (adapter_name, type_name) = type_name.split_once(ADAPTER_SEP).unwrap(); match adapter_name { @@ -315,6 +401,37 @@ impl<'v> Adapter<'v> for TrustfallMultiAdapter { }), ) } + "fs" => { + let contexts = contexts.collect::>(); + + let properties = self.filesystem.resolve_neighbors( + Box::new( + contexts + .clone() + .into_iter() + .map(|v| v.flat_map(&mut |v: V| v.into_vertex())), + ), + &Arc::from(type_name), + edge_name, + parameters, + resolve_info, + ); + + Box::new( + properties + .into_iter() + .zip(contexts) + .map(|((_ctx, vals), og_ctx)| { + ( + og_ctx, + Box::new( + vals.inspect(|v| trace!(?v, "Got vertex")) + .map(TrustfallMultiVertex::Filesystem), + ) as Box<_>, + ) + }), + ) + } _ => unreachable!(), } } @@ -326,7 +443,7 @@ impl<'v> Adapter<'v> for TrustfallMultiAdapter { coerce_to_type: &Arc, resolve_info: &trustfall::provider::ResolveInfo, ) -> trustfall::provider::ContextOutcomeIterator<'v, V, bool> { - trace!(?type_name, ?coerce_to_type, "Trying to coerce"); + trace!(?type_name, ?coerce_to_type, "Top-level coerce"); let (adapter_name, coerce_to_type) = coerce_to_type.split_once(ADAPTER_SEP).unwrap(); match adapter_name { @@ -352,6 +469,30 @@ impl<'v> Adapter<'v> for TrustfallMultiAdapter { .map(|((_ctx, val), og_ctx)| (og_ctx, val)), ) } + "fs" => { + let contexts = contexts.collect::>(); + + let properties = self.filesystem.resolve_coercion( + Box::new( + contexts + .clone() + .into_iter() + .map(|v| v.flat_map(&mut |v: V| v.into_vertex())), + ), + type_name, + &Arc::from(coerce_to_type), + resolve_info, + ); + + let type_name = type_name.clone(); + let coerce_to_type = coerce_to_type.to_string(); + Box::new(properties.into_iter().zip(contexts).map( + move |((_ctx, allowed), og_ctx)| { + trace!(?allowed, ?type_name, ?coerce_to_type, "Allowed coercion?"); + (og_ctx, allowed) + }, + )) + } _ => unreachable!(), } } @@ -454,7 +595,7 @@ impl<'a> Adapter<'a> for PlaixtAdapter { fn resolve_neighbors + 'a>( &self, contexts: trustfall::provider::ContextIterator<'a, V>, - _type_name: &Arc, + type_name: &Arc, edge_name: &Arc, _parameters: &trustfall::provider::EdgeParameters, _resolve_info: &trustfall::provider::ResolveEdgeInfo, @@ -463,6 +604,7 @@ impl<'a> Adapter<'a> for PlaixtAdapter { V, trustfall::provider::VertexIterator<'a, Self::Vertex>, > { + trace!(?type_name, ?edge_name, "Resolving neighbors"); match edge_name.as_ref() { "fields" => resolve_neighbors_with(contexts, |c| { Box::new( @@ -474,7 +616,8 @@ impl<'a> Adapter<'a> for PlaixtAdapter { .into_iter(), ) }), - _ => unreachable!(), + _ => resolve_neighbors_with(contexts, |c| todo!()), + _ => unreachable!("Could not resolve {edge_name}"), } } diff --git a/examples/changelog.plrecs b/examples/changelog.plrecs index 03e02c2..af02d2a 100644 --- a/examples/changelog.plrecs +++ b/examples/changelog.plrecs @@ -21,3 +21,7 @@ changelog "2025-02-07" { version "0.1.0" type "Feature" } + +file_test "2025-02-08" { + path "Cargo.toml" +} diff --git a/examples/definitions/file_test.pldef b/examples/definitions/file_test.pldef new file mode 100644 index 0000000..40b12c0 --- /dev/null +++ b/examples/definitions/file_test.pldef @@ -0,0 +1,7 @@ +// This is the default changelog entry for the plaixt project + +define since="2025-02-08 00:00:00+01:00" { + fields { + path is="Path" + } +} diff --git a/flake.lock b/flake.lock index 5db1f8b..8eff4fc 100644 --- a/flake.lock +++ b/flake.lock @@ -63,11 +63,11 @@ ] }, "locked": { - "lastModified": 1738117527, - "narHash": "sha256-GFviGfaezjGLFUlxdv3zyC7rSZvTXqwcG/YsF6MDkOw=", + "lastModified": 1738981474, + "narHash": "sha256-YIELTXxfATG0g1wXjyaOWA4qrlubds3MG4FvMPCxSGg=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "6a3dc6ce4132bd57359214d986db376f2333c14d", + "rev": "5c571e5ff246d8fc5f76ba6e38dc8edb6e4002fe", "type": "github" }, "original": { diff --git a/query b/query index 80fc919..1824356 100644 --- a/query +++ b/query @@ -1,13 +1,27 @@ { Plaixt__RecordsAll { - ... on Plaixt__changelog { + ... on Plaixt__file_test { at @output kind @output fields { - title @output @filter(op: "has_substring", value: ["$search"]) - version @output - type @output + path { + ... on fs__File { + size @output + } + } } } } + + # fs__Path(path: "./crates/plaixt/") { + # ... on fs__Folder { + # directory: path @output + # children @fold { + # ... on fs__File { + # file: path @output + # size @output + # } + # } + # } + # } } diff --git a/rust-toolchain.toml b/rust-toolchain.toml index efd9dc3..fcb78ec 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "1.84.0" +channel = "1.84.1"