hypertune 0.6.2

Hypertune SDK for type safe configuration
Documentation
use serde_json::Value;

use crate::node::Node;
use crate::node_props::NodeProps;
use crate::sdk::NodeMethods;

pub struct VoidNode {
    node: Node,
}

impl VoidNode {
    pub fn new(props: NodeProps) -> Self {
        Self {
            node: Node::new(props),
        }
    }

    pub fn get(&self) {
        match self.evaluate() {
            Ok(Value::Bool(true)) => (),
            value => {
                self.log_unexpected_value_error(value);
            }
        }
    }
}

impl GetNode for VoidNode {
    fn get_node(&self) -> &Node {
        &self.node
    }
}

pub struct BooleanNode {
    node: Node,
}

impl BooleanNode {
    pub fn new(props: NodeProps) -> Self {
        Self {
            node: Node::new(props),
        }
    }

    pub fn get(&self, fallback: bool) -> bool {
        match self.evaluate() {
            Ok(Value::Bool(value)) => value,
            value => {
                self.log_unexpected_value_error(value);
                fallback
            }
        }
    }
}

impl GetNode for BooleanNode {
    fn get_node(&self) -> &Node {
        &self.node
    }
}

pub struct IntNode {
    node: Node,
}

impl IntNode {
    pub fn new(props: NodeProps) -> Self {
        Self {
            node: Node::new(props),
        }
    }

    pub fn get(&self, fallback: i64) -> i64 {
        match self.evaluate() {
            Ok(Value::Number(number)) if number.is_i64() => number.as_i64().unwrap(),
            value => {
                self.log_unexpected_value_error(value);
                fallback
            }
        }
    }
}

impl GetNode for IntNode {
    fn get_node(&self) -> &Node {
        &self.node
    }
}

pub struct FloatNode {
    node: Node,
}

impl FloatNode {
    pub fn new(props: NodeProps) -> Self {
        Self {
            node: Node::new(props),
        }
    }

    pub fn get(&self, fallback: f64) -> f64 {
        match self.evaluate() {
            Ok(Value::Number(ref number)) => match number.as_f64() {
                Some(number) => number,
                None => {
                    self.log_unexpected_value_error(Ok(Value::Number(number.to_owned())));
                    fallback
                }
            },
            value => {
                self.log_unexpected_value_error(value);
                fallback
            }
        }
    }
}

impl GetNode for FloatNode {
    fn get_node(&self) -> &Node {
        &self.node
    }
}

pub struct StringNode {
    node: Node,
}

impl StringNode {
    pub fn new(props: NodeProps) -> Self {
        Self {
            node: Node::new(props),
        }
    }

    pub fn get(&self, fallback: String) -> String {
        match self.evaluate() {
            Ok(Value::String(string)) => string,
            value => {
                self.log_unexpected_value_error(value);
                fallback
            }
        }
    }
}

impl GetNode for StringNode {
    fn get_node(&self) -> &Node {
        &self.node
    }
}

pub trait GetNode {
    fn get_node(&self) -> &Node;
}