logic_mesh/blocks/misc/
has_value.rs

1// Copyright (c) 2022-2024, Radu Racariu.
2
3use 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/// Outputs true if the input is not null.
16#[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}