logic_mesh/blocks/misc/
parse_number.rs1use uuid::Uuid;
4
5use crate::base::{
6 block::{Block, BlockDesc, BlockProps, BlockState},
7 input::{input_reader::InputReader, Input, InputProps},
8 output::Output,
9};
10
11use libhaystack::{
12 encoding::zinc,
13 val::{kind::HaystackKind, Value},
14};
15
16use crate::{blocks::InputImpl, blocks::OutputImpl};
17
18#[block]
20#[derive(BlockProps, Debug)]
21#[category = "misc"]
22pub struct ParseNumber {
23 #[input(name = "in", kind = "Str")]
24 pub input: InputImpl,
25 #[output(kind = "Number")]
26 pub out: OutputImpl,
27}
28
29impl Block for ParseNumber {
30 async fn execute(&mut self) {
31 self.read_inputs_until_ready().await;
32
33 if let Some(Value::Str(input)) = self.input.get_value() {
34 let parsed = input.value.parse::<f64>();
35 if let Ok(parsed) = parsed {
36 self.out.set(parsed.into());
37 } else if let Ok(Value::Number(number)) = zinc::decode::from_str(&input.value) {
38 self.out.set(number.into());
39 }
40 }
41 }
42}
43
44#[cfg(test)]
45mod test {
46
47 use libhaystack::val::Value;
48
49 use crate::{
50 base::block::test_utils::write_block_inputs, base::block::Block, blocks::misc::ParseNumber,
51 };
52
53 #[tokio::test]
54 async fn test_parse_number() {
55 let mut block = ParseNumber::new();
56
57 write_block_inputs(&mut [(&mut block.input, ("33.5").into())]).await;
58
59 block.execute().await;
60 assert_eq!(block.out.value, 33.5.into());
61 }
62
63 #[tokio::test]
64 async fn test_parse_number_unit() {
65 let mut block = ParseNumber::new();
66
67 write_block_inputs(&mut [(&mut block.input, ("33.5F").into())]).await;
68
69 block.execute().await;
70 assert_eq!(block.out.value, Value::make_number_unit(33.5, "F".into()));
71 }
72}