logic_mesh/blocks/misc/
has_value.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;
12
13use crate::{blocks::InputImpl, blocks::OutputImpl};
14
15#[block]
17#[derive(BlockProps, Debug)]
18#[category = "misc"]
19pub struct HasValue {
20 #[input(name = "in", kind = "Null")]
21 pub input: InputImpl,
22 #[output(kind = "Bool")]
23 pub out: OutputImpl,
24}
25
26impl Block for HasValue {
27 async fn execute(&mut self) {
28 self.read_inputs_until_ready().await;
29
30 let has_value = self.input.get_value().map_or(false, |val| val.has_value());
31 self.out.set(has_value.into());
32 }
33}
34
35#[cfg(test)]
36mod test {
37
38 use libhaystack::val::Value;
39
40 use crate::{
41 base::block::test_utils::write_block_inputs, base::block::Block,
42 blocks::misc::has_value::HasValue,
43 };
44
45 #[tokio::test]
46 async fn has_value_true() {
47 let mut block = HasValue::new();
48
49 write_block_inputs(&mut [(&mut block.input, ("test").into())]).await;
50
51 block.execute().await;
52 assert_eq!(block.out.value, true.into());
53 }
54
55 #[tokio::test]
56 async fn has_value_false() {
57 let mut block = HasValue::new();
58
59 write_block_inputs(&mut [(&mut block.input, Value::Null)]).await;
60
61 block.execute().await;
62 assert_eq!(block.out.value, false.into());
63 }
64}