diff options
| author | s-ol <s+removethis@s-ol.nu> | 2026-01-23 18:10:39 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2026-01-23 18:10:39 +0000 |
| commit | d4366a4c12224da7ef3c08b9ca9d119da11b302a (patch) | |
| tree | 4b3f746e6fb071863bec80cf2e763e830226a9eb /src/library.rs | |
| parent | variadic arithmetic (diff) | |
| download | nodetoy-d4366a4c12224da7ef3c08b9ca9d119da11b302a.tar.gz nodetoy-d4366a4c12224da7ef3c08b9ca9d119da11b302a.zip | |
Error checking
Diffstat (limited to 'src/library.rs')
| -rw-r--r-- | src/library.rs | 50 |
1 files changed, 28 insertions, 22 deletions
diff --git a/src/library.rs b/src/library.rs index cd3b36c..65929a0 100644 --- a/src/library.rs +++ b/src/library.rs @@ -3,7 +3,7 @@ use itertools::{Itertools, izip}; use serde::{Deserialize, Serialize}; use std::fmt; -use crate::node::ConcreteNode; +use crate::node::{CompileError, ConcreteNode}; use crate::types::{ Dimension, Dimension::*, FloatPrecision::*, ScalarType, ScalarType::*, Type, Type::*, TypeSignature, @@ -70,7 +70,7 @@ trait FixedNode: fmt::Debug { inputs: Vec<String>, outputs: Vec<String>, f: &mut dyn fmt::Write, - ) -> fmt::Result { + ) -> Result<(), CompileError> { let mut pairs = signature.outputs.iter().zip(outputs.iter()); let (out_typ, out_name) = pairs.next().expect("no output"); @@ -82,7 +82,8 @@ trait FixedNode: fmt::Debug { let first = func[..1].to_lowercase(); let rest = func[1..].to_string(); let params = inputs.iter().chain(outputs.iter().skip(1)).join(", "); - writeln!(f, "{out_typ} {out_name} = {first}{rest}({params});") + writeln!(f, "{out_typ} {out_name} = {first}{rest}({params});")?; + Ok(()) } } @@ -111,12 +112,12 @@ impl<T: FixedNode> ConcreteNode for T { inputs: Vec<Option<String>>, outputs: Vec<String>, f: &mut dyn fmt::Write, - ) -> fmt::Result { + ) -> Result<(), CompileError> { let inputs: Option<Vec<String>> = inputs.into_iter().collect(); if let Some(inputs) = inputs { self.compile(signature, inputs, outputs, f) } else { - Err(fmt::Error) + Err(CompileError::MissingArguments) } } } @@ -135,7 +136,7 @@ impl ConcreteNode for ProvideImpl { trait OutputOnlyNode: fmt::Debug { fn output_type(&self) -> Type; - fn compile(&self, out_type: Type, output: &str, f: &mut dyn fmt::Write) -> fmt::Result; + fn compile(&self, out_type: Type, output: &str, f: &mut dyn fmt::Write) -> Result<(), CompileError>; } impl<T: OutputOnlyNode> ConcreteNode for T { @@ -160,7 +161,7 @@ impl<T: OutputOnlyNode> ConcreteNode for T { inputs: Vec<Option<String>>, outputs: Vec<String>, f: &mut dyn fmt::Write, - ) -> fmt::Result { + ) -> Result<(), CompileError> { self.compile(signature.outputs[0], &outputs[0], f) } } @@ -235,7 +236,7 @@ impl ConcreteNode for BinArithmetic { inputs: Vec<Option<String>>, outputs: Vec<String>, f: &mut dyn fmt::Write, - ) -> fmt::Result { + ) -> Result<(), CompileError> { let out_typ = &signature.outputs[0]; let out_name = &outputs[0]; let sym = match self { @@ -245,7 +246,8 @@ impl ConcreteNode for BinArithmetic { Self::Divide => " / ", }; let expr = inputs.iter().filter_map(|s| s.as_ref()).join(sym); - writeln!(f, "{out_typ} {out_name} = {expr};") + writeln!(f, "{out_typ} {out_name} = {expr};")?; + Ok(()) } } @@ -791,14 +793,15 @@ impl FixedNode for Output { inputs: Vec<String>, _outputs: Vec<String>, f: &mut dyn fmt::Write, - ) -> fmt::Result { + ) -> Result<(), CompileError> { match signature.inputs[0] { - Vector(_, D2) => writeln!(f, "out_color = vec4({}, 0.0, 1.0);", inputs[0]), - Vector(_, D3) => writeln!(f, "out_color = vec4({}, 1.0);", inputs[0]), - Vector(_, D4) => writeln!(f, "out_color = {};", inputs[0]), - Scalar(_) => writeln!(f, "out_color = vec4(vec3({}), 1.0);", inputs[0]), + Vector(_, D2) => writeln!(f, "out_color = vec4({}, 0.0, 1.0);", inputs[0])?, + Vector(_, D3) => writeln!(f, "out_color = vec4({}, 1.0);", inputs[0])?, + Vector(_, D4) => writeln!(f, "out_color = {};", inputs[0])?, + Scalar(_) => writeln!(f, "out_color = vec4(vec3({}), 1.0);", inputs[0])?, _ => unreachable!("invalid output type"), - } + }; + Ok(()) } } impl NodeIndex for Output { @@ -968,10 +971,11 @@ where _inputs: Vec<Option<String>>, outputs: Vec<String>, f: &mut dyn fmt::Write, - ) -> fmt::Result { + ) -> Result<(), CompileError> { let out_typ = Self::TYPE; let out_name = &outputs[0]; - writeln!(f, "{out_typ} {out_name} = {};", self) + writeln!(f, "{out_typ} {out_name} = {};", self)?; + Ok(()) } fn show_body(&mut self, ui: &mut egui::Ui) -> egui::Response { @@ -1122,7 +1126,7 @@ impl ConcreteNode for Input { _inputs: Vec<Option<String>>, outputs: Vec<String>, f: &mut dyn fmt::Write, - ) -> fmt::Result { + ) -> Result<(), CompileError> { let out_typ = &signature.outputs[0]; let out_name = &outputs[0]; writeln!( @@ -1133,7 +1137,8 @@ impl ConcreteNode for Input { Self::Resolution => "in_resolution", Self::Time => "in_time", } - ) + )?; + Ok(()) } } impl NodeIndex for Input { @@ -1173,7 +1178,7 @@ impl FixedNode for SplitVector { inputs: Vec<String>, outputs: Vec<String>, f: &mut dyn fmt::Write, - ) -> fmt::Result { + ) -> Result<(), CompileError> { let input = &inputs[0]; for (typ, name, component) in izip!( signature.outputs.into_iter(), @@ -1223,11 +1228,12 @@ impl FixedNode for CombineVector { inputs: Vec<String>, outputs: Vec<String>, f: &mut dyn fmt::Write, - ) -> fmt::Result { + ) -> Result<(), CompileError> { let out_typ = &signature.outputs[0]; let out_name = &outputs[0]; let params = inputs.iter().join(", "); - writeln!(f, "{out_typ} {out_name} = {out_typ}({params});") + writeln!(f, "{out_typ} {out_name} = {out_typ}({params});")?; + Ok(()) } } impl fmt::Display for CombineVector { |
