logic_mesh/blocks/math/
pow.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::val::{kind::HaystackKind, Number, Value};
12
13use crate::{blocks::InputImpl, blocks::OutputImpl};
14
15#[block]
17#[derive(BlockProps, Debug)]
18#[dis = "Power"]
19#[category = "math"]
20pub struct Pow {
21 #[input(name = "base", kind = "Number")]
22 pub base: InputImpl,
23 #[input(name = "exponent", kind = "Number")]
24 pub exponent: InputImpl,
25 #[output(kind = "Number")]
26 pub out: OutputImpl,
27}
28
29impl Block for Pow {
30 async fn execute(&mut self) {
31 self.read_inputs_until_ready().await;
32
33 if let (Some(Value::Number(base)), Some(Value::Number(exponent))) =
34 (self.base.get_value(), self.exponent.get_value())
35 {
36 self.out.set(
37 Number {
38 value: base.value.powf(exponent.value),
39 unit: base.unit,
40 }
41 .into(),
42 );
43 }
44 }
45}
46
47#[cfg(test)]
48mod test {
49
50 use std::assert_matches::assert_matches;
51
52 use libhaystack::val::{Number, Value};
53
54 use crate::{
55 base::block::test_utils::write_block_inputs,
56 base::{block::Block, input::input_reader::InputReader},
57 blocks::math::Pow,
58 };
59
60 #[tokio::test]
61 async fn test_pow_block() {
62 let mut block = Pow::new();
63
64 for _ in
65 write_block_inputs(&mut [(&mut block.base, 4.into()), (&mut block.exponent, 4.into())])
66 .await
67 {
68 block.read_inputs().await;
69 }
70
71 block.execute().await;
72
73 assert_matches!(
74 block.out.value,
75 Value::Number(Number { value, .. }) if value == 256.0
76 );
77 }
78}