From b6876f9df6e3119331fac01c0bc954ca9f3c798b Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Sun, 5 Apr 2026 20:33:57 +0800 Subject: Add general renderer support with serialization formats --- mingling_core/src/program/exec.rs | 40 +++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) (limited to 'mingling_core/src/program/exec.rs') diff --git a/mingling_core/src/program/exec.rs b/mingling_core/src/program/exec.rs index 29cfa1d..1a4f6ff 100644 --- a/mingling_core/src/program/exec.rs +++ b/mingling_core/src/program/exec.rs @@ -23,14 +23,16 @@ where Ok((dispatcher, args)) => { // Entry point current = match dispatcher.begin(args) { - ChainProcess::Ok((any, Next::Renderer)) => return Ok(render::(any)), + ChainProcess::Ok((any, Next::Renderer)) => { + return Ok(render::(&program, any)); + } ChainProcess::Ok((any, Next::Chain)) => any, ChainProcess::Err(e) => return Err(e.into()), }; } Err(ProgramInternalExecuteError::DispatcherNotFound) => { // No matching Dispatcher is found - current = C::build_dispatcher_not_found(program.args); + current = C::build_dispatcher_not_found(program.args.clone()); } Err(e) => return Err(e), }; @@ -42,16 +44,16 @@ where // If a chain exists, execute as a chain if C::has_chain(¤t) { match C::do_chain(current).await { - ChainProcess::Ok((any, Next::Renderer)) => return Ok(render::(any)), + ChainProcess::Ok((any, Next::Renderer)) => { + return Ok(render::(&program, any)); + } ChainProcess::Ok((any, Next::Chain)) => any, ChainProcess::Err(e) => return Err(e.into()), } } // If no chain exists, attempt to render else if C::has_renderer(¤t) { - let mut render_result = RenderResult::default(); - C::render(current, &mut render_result); - return Ok(render_result); + return Ok(render::(&program, current)); } // No renderer exists else { @@ -113,10 +115,28 @@ where } #[inline(always)] -fn render, G: Display>(any: AnyOutput) -> RenderResult { - let mut render_result = RenderResult::default(); - C::render(any, &mut render_result); - render_result +#[allow(unused_variables)] +fn render, G: Display>( + program: &Program, + any: AnyOutput, +) -> RenderResult { + #[cfg(not(feature = "general_renderer"))] + { + let mut render_result = RenderResult::default(); + C::render(any, &mut render_result); + render_result + } + #[cfg(feature = "general_renderer")] + { + match program.general_renderer_name { + super::GeneralRendererSetting::Disable => { + let mut render_result = RenderResult::default(); + C::render(any, &mut render_result); + render_result + } + _ => C::general_render(any, &program.general_renderer_name).unwrap(), + } + } } // Get all registered dispatcher names from the program -- cgit