aboutsummaryrefslogtreecommitdiffstats
path: root/src/library.rs
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2026-01-23 18:10:39 +0000
committers-ol <s+removethis@s-ol.nu>2026-01-23 18:10:39 +0000
commitd4366a4c12224da7ef3c08b9ca9d119da11b302a (patch)
tree4b3f746e6fb071863bec80cf2e763e830226a9eb /src/library.rs
parentvariadic arithmetic (diff)
downloadnodetoy-d4366a4c12224da7ef3c08b9ca9d119da11b302a.tar.gz
nodetoy-d4366a4c12224da7ef3c08b9ca9d119da11b302a.zip
Error checking
Diffstat (limited to 'src/library.rs')
-rw-r--r--src/library.rs50
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 {