diff --git a/Cargo.toml b/Cargo.toml index 6527b6f..5f4bbef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,8 @@ members = [ "crates/app", "crates/eval", - "crates/ir", "crates/prowocessing", + "crates/ir", + "crates/prowocessing", ] resolver = "2" diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index d5a260c..7780bbb 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -27,7 +27,7 @@ enum Commands { }, Dev { #[command(subcommand)] - dev_command: DevCommands, + command: DevCommands, }, } @@ -50,7 +50,9 @@ fn main() { machine.feed(ir); machine.eval_full(); } - Commands::Dev { dev_command } => dev_command.run(), + Commands::Dev { + command: dev_command, + } => dev_command.run(), } } @@ -85,7 +87,8 @@ mod dev { let pipe = PipelineBuilder::new().add(1).stringify().build(); println!( "{:?}", - pipe.run(vec![num0.into(), num1.into()].into()).into_inner()[0] + pipe.run(vec![&num0.into(), &num1.into()].into()) + .into_inner()[0] ); } } diff --git a/crates/eval/src/lib.rs b/crates/eval/src/lib.rs index c3a6c38..8687d91 100644 --- a/crates/eval/src/lib.rs +++ b/crates/eval/src/lib.rs @@ -37,7 +37,7 @@ impl Available { #[must_use] pub fn pick(&self) -> Box { match self { - Self::Debug => Box::new(kind::debug::Evaluator::default()), + Self::Debug => Box::::default(), } } } diff --git a/crates/prowocessing/src/experimental/trait_based/data.rs b/crates/prowocessing/src/experimental/trait_based/data.rs index 51ec597..e3dd671 100644 --- a/crates/prowocessing/src/experimental/trait_based/data.rs +++ b/crates/prowocessing/src/experimental/trait_based/data.rs @@ -1,7 +1,5 @@ //! Definitions of the data transfer and storage types. -/// Types for element and pipeline IO pub mod io; -/// Raw data types contained in `io` pub mod raw; diff --git a/crates/prowocessing/src/experimental/trait_based/data/io.rs b/crates/prowocessing/src/experimental/trait_based/data/io.rs index 849f955..59e2f28 100644 --- a/crates/prowocessing/src/experimental/trait_based/data/io.rs +++ b/crates/prowocessing/src/experimental/trait_based/data/io.rs @@ -1,22 +1,19 @@ -use super::raw::{Data, OwnedData}; +//! Types for element and pipeline IO + +use std::{borrow::ToOwned, convert::Into}; + +use super::raw::Data; /// Newtype struct with borrowed types for pipeline/element inputs, so that doesn't force a move or clone -pub struct Inputs<'a>(Vec>); +pub struct Inputs<'a>(pub Vec<&'a Data>); -impl<'a> Inputs<'a> { - /// get inner value(s) - pub(crate) fn inner(&self) -> Vec> { - self.0.clone() - } -} - -impl<'a> From>> for Inputs<'a> { - fn from(value: Vec>) -> Self { +impl<'a> From> for Inputs<'a> { + fn from(value: Vec<&'a Data>) -> Self { Self(value) } } -impl<'a, T: Into>> From for Inputs<'a> { +impl<'a, T: Into<&'a Data>> From for Inputs<'a> { fn from(value: T) -> Self { Self(vec![value.into()]) } @@ -24,37 +21,31 @@ impl<'a, T: Into>> From for Inputs<'a> { impl<'a> From<&'a Outputs> for Inputs<'a> { fn from(value: &'a Outputs) -> Self { - Self(value.0.iter().map(std::convert::Into::into).collect()) + Self(value.0.iter().map(Into::into).collect()) } } -/// Newtype struct around `OwnedData` for pipeline/element outputs -pub struct Outputs(Vec); +/// Used for pipeline/element outputs +pub struct Outputs(Vec); impl Outputs { /// consume self and return inner value(s) - pub fn into_inner(self) -> Vec { + pub fn into_inner(self) -> Vec { self.0 } } -impl From> for Outputs { - fn from(value: Vec) -> Self { +impl From> for Outputs { + fn from(value: Vec) -> Self { Self(value) } } -impl> From for Outputs { +impl> From for Outputs { fn from(value: T) -> Self { Self(vec![value.into()]) } } impl From> for Outputs { fn from(value: Inputs) -> Self { - Self( - value - .0 - .into_iter() - .map(|i: Data<'_>| Data::to_owned_data(&i)) - .collect(), - ) + Self(value.0.into_iter().map(ToOwned::to_owned).collect()) } } diff --git a/crates/prowocessing/src/experimental/trait_based/data/raw.rs b/crates/prowocessing/src/experimental/trait_based/data/raw.rs index e028474..502bb91 100644 --- a/crates/prowocessing/src/experimental/trait_based/data/raw.rs +++ b/crates/prowocessing/src/experimental/trait_based/data/raw.rs @@ -1,58 +1,20 @@ -//! Dynamic data storage and transfer types +//! Dynamic data storage and transfer types for use in [`io`] -/// Owned data type, for use mostly in outputs and storage +// Dynamic data type #[derive(Clone, Debug)] -pub enum OwnedData { +pub enum Data { String(String), Int(i32), } -impl From for OwnedData { +impl From for Data { fn from(value: String) -> Self { Self::String(value) } } -impl From for OwnedData { +impl From for Data { fn from(value: i32) -> Self { Self::Int(value) } } - -/// Unowned data type, for inputs into runner functions -#[derive(Clone, Copy)] -pub enum Data<'a> { - String(&'a str), - Int(i32), -} - -impl Data<'_> { - /// converts itself to `OwnedData` - pub fn to_owned_data(&self) -> OwnedData { - match self { - Data::String(s) => (*s).to_owned().into(), - Data::Int(i) => (*i).into(), - } - } -} - -impl<'a> From<&'a str> for Data<'a> { - fn from(value: &'a str) -> Self { - Self::String(value) - } -} - -impl From for Data<'_> { - fn from(value: i32) -> Self { - Self::Int(value) - } -} - -impl<'a> From<&'a OwnedData> for Data<'a> { - fn from(value: &'a OwnedData) -> Self { - match value { - OwnedData::String(s) => Data::String(s), - OwnedData::Int(i) => Data::Int(*i), - } - } -} diff --git a/crates/prowocessing/src/experimental/trait_based/ops/num.rs b/crates/prowocessing/src/experimental/trait_based/ops/num.rs index 0b2a295..1a0a701 100644 --- a/crates/prowocessing/src/experimental/trait_based/ops/num.rs +++ b/crates/prowocessing/src/experimental/trait_based/ops/num.rs @@ -14,11 +14,10 @@ pub struct Add(pub i32); impl PipelineElement for Add { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - if let [Data::Int(i0), Data::Int(i1), ..] = input.inner()[..] { - (i0 + i1).into() - } else { + let [Data::Int(i0), Data::Int(i1), ..] = input.0[..] else { panic!("Invalid data passed") - } + }; + (i0 + i1).into() } } @@ -35,11 +34,10 @@ pub struct Subtract(pub i32); impl PipelineElement for Subtract { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - if let [Data::Int(i0), Data::Int(i1), ..] = input.inner()[..] { - (i0 + i1).into() - } else { + let [Data::Int(i0), Data::Int(i1), ..] = input.0[..] else { panic!("Invalid data passed") - } + }; + (i0 + i1).into() } } @@ -56,11 +54,10 @@ pub struct Stringify; impl PipelineElement for Stringify { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - if let [Data::Int(int), ..] = input.inner()[..] { - int.to_string().into() - } else { + let [Data::Int(int), ..] = input.0[..] else { panic!("Invalid data passed") - } + }; + int.to_string().into() } } diff --git a/crates/prowocessing/src/experimental/trait_based/ops/str.rs b/crates/prowocessing/src/experimental/trait_based/ops/str.rs index 38fe992..01fd25a 100644 --- a/crates/prowocessing/src/experimental/trait_based/ops/str.rs +++ b/crates/prowocessing/src/experimental/trait_based/ops/str.rs @@ -12,11 +12,10 @@ pub struct Concatenate(pub String); impl PipelineElement for Concatenate { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - if let [Data::String(s0), Data::String(s1), ..] = input.inner()[..] { - format!("{s0}{s1}").into() - } else { + let [Data::String(s0), Data::String(s1), ..] = input.0[..] else { panic!("Invalid data passed") - } + }; + format!("{s0}{s1}").into() } } @@ -33,11 +32,10 @@ pub struct Upper; impl PipelineElement for Upper { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - if let [Data::String(s), ..] = input.inner()[..] { - s.to_uppercase().into() - } else { + let [Data::String(s), ..] = input.0[..] else { panic!("Invalid data passed") - } + }; + s.to_uppercase().into() } } @@ -54,11 +52,10 @@ pub struct Lower; impl PipelineElement for Lower { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - if let [Data::String(s), ..] = input.inner()[..] { - s.to_lowercase().into() - } else { + let [Data::String(s), ..] = input.0[..] else { panic!("Invalid data passed") - } + }; + s.to_lowercase().into() } }