From 7ce68cd11516bd7cf037ecea99a92aee7c31b2c3 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Sat, 28 Mar 2026 00:47:46 +0800 Subject: Add initial Mingling framework codebase --- mingling/src/asset/chain.rs | 8 ++++++ mingling/src/asset/chain/error.rs | 13 ++++++++++ mingling/src/asset/dispatcher.rs | 19 ++++++++++++++ mingling/src/asset/node.rs | 54 +++++++++++++++++++++++++++++++++++++++ mingling/src/asset/renderer.rs | 6 +++++ 5 files changed, 100 insertions(+) create mode 100644 mingling/src/asset/chain.rs create mode 100644 mingling/src/asset/chain/error.rs create mode 100644 mingling/src/asset/dispatcher.rs create mode 100644 mingling/src/asset/node.rs create mode 100644 mingling/src/asset/renderer.rs (limited to 'mingling/src/asset') diff --git a/mingling/src/asset/chain.rs b/mingling/src/asset/chain.rs new file mode 100644 index 0000000..1ea1125 --- /dev/null +++ b/mingling/src/asset/chain.rs @@ -0,0 +1,8 @@ +use crate::ChainProcess; + +pub mod error; + +pub trait Chain { + type Previous; + fn proc(p: Self::Previous) -> impl Future + Send; +} diff --git a/mingling/src/asset/chain/error.rs b/mingling/src/asset/chain/error.rs new file mode 100644 index 0000000..d4da4ac --- /dev/null +++ b/mingling/src/asset/chain/error.rs @@ -0,0 +1,13 @@ +use crate::AnyOutput; + +#[derive(thiserror::Error, Debug)] +pub enum ChainProcessError { + #[error("Other error: {0}")] + Other(String), + + #[error("IO error: {0}")] + IO(#[from] std::io::Error), + + #[error("Broken chain")] + Broken(AnyOutput), +} diff --git a/mingling/src/asset/dispatcher.rs b/mingling/src/asset/dispatcher.rs new file mode 100644 index 0000000..31623d3 --- /dev/null +++ b/mingling/src/asset/dispatcher.rs @@ -0,0 +1,19 @@ +use crate::{ChainProcess, Program, asset::node::Node}; + +pub use mingling_macros::Dispatcher; + +pub trait Dispatcher { + fn node(&self) -> Node; +} + +pub trait DispatcherChain { + fn begin(&self) -> ChainProcess; +} + +impl Program { + /// Adds a dispatcher to the program. + pub fn with_dispatcher(&mut self, dispatcher: D) { + let dispatcher = Box::new(dispatcher); + self.dispatcher.push(dispatcher); + } +} diff --git a/mingling/src/asset/node.rs b/mingling/src/asset/node.rs new file mode 100644 index 0000000..c8b7600 --- /dev/null +++ b/mingling/src/asset/node.rs @@ -0,0 +1,54 @@ +use just_fmt::kebab_case; + +#[derive(Debug, Default)] +pub struct Node { + node: Vec, +} + +impl Node { + pub fn join(self, node: impl Into) -> Node { + let mut new_node = self.node; + new_node.push(node.into()); + Node { node: new_node } + } +} + +impl From<&str> for Node { + fn from(s: &str) -> Self { + let node = s.split('.').map(|part| kebab_case!(part)).collect(); + Node { node } + } +} + +impl From for Node { + fn from(s: String) -> Self { + let node = s.split('.').map(|part| kebab_case!(part)).collect(); + Node { node } + } +} + +impl PartialEq for Node { + fn eq(&self, other: &Self) -> bool { + self.node == other.node + } +} + +impl Eq for Node {} + +impl PartialOrd for Node { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for Node { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + self.node.cmp(&other.node) + } +} + +impl std::fmt::Display for Node { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.node.join(".")) + } +} diff --git a/mingling/src/asset/renderer.rs b/mingling/src/asset/renderer.rs new file mode 100644 index 0000000..3852b55 --- /dev/null +++ b/mingling/src/asset/renderer.rs @@ -0,0 +1,6 @@ +use crate::RenderResult; + +pub trait Renderer { + type Previous; + fn render(p: Self::Previous, r: &mut RenderResult); +} -- cgit