Skip to main content

gridline_engine/engine/
format.rs

1//! Value formatting for display.
2//!
3//! Converts Rhai Dynamic values and numbers into user-friendly display strings.
4//! Handles special cases like NaN, infinity, and formatting numbers without
5//! unnecessary decimal places.
6
7use super::Dynamic;
8
9/// Format a Dynamic value for display.
10pub fn format_dynamic(value: &Dynamic) -> String {
11    if value.is_unit() {
12        String::new()
13    } else if let Ok(n) = value.as_float() {
14        format_number(n)
15    } else if let Ok(n) = value.as_int() {
16        n.to_string()
17    } else if let Ok(b) = value.as_bool() {
18        if b { "TRUE" } else { "FALSE" }.to_string()
19    } else if let Ok(s) = value.clone().into_string() {
20        s
21    } else {
22        format!("{:?}", value)
23    }
24}
25
26/// Format a number for display.
27pub fn format_number(n: f64) -> String {
28    if n.is_nan() {
29        "#NAN!".to_string()
30    } else if n.is_infinite() {
31        "#INF!".to_string()
32    } else if n.fract() == 0.0 && n.abs() < 1e10 {
33        format!("{:.0}", n)
34    } else {
35        format!("{:.2}", n)
36    }
37}