nu_plugin_plotters 0.2.5+0.111.0

A nushell plugin for for plotting charts
Documentation
use nu_protocol::{FromValue, IntoValue, ShellError, Value};
use serde::{Deserialize, Serialize};

use super::Coord1d;

#[derive(Debug, Clone, Copy, IntoValue, PartialEq, Eq, Serialize, Deserialize)]
pub struct Coord2d {
    pub x: Coord1d,
    pub y: Coord1d,
}

impl FromValue for Coord2d {
    fn from_value(v: Value) -> Result<Self, ShellError> {
        #[derive(FromValue)]
        struct Coord2dDTO {
            x: Coord1d,
            y: Coord1d,
        }

        let tuple = <(Coord1d, Coord1d)>::from_value(v.clone());
        let record = Coord2dDTO::from_value(v);
        match (tuple, record) {
            (Ok((x, y)), _) => Ok(Self { x, y }),
            (_, Ok(Coord2dDTO { x, y })) => Ok(Self { x, y }),
            (Err(tuple_e), Err(record_e)) => Err(ShellError::GenericError {
                error: "Invalid 2D coordinate.".to_string(),
                msg: "A 2D coordinate needs to be either pair or a x-y-record of numbers."
                    .to_string(),
                span: None,
                help: None,
                inner: vec![tuple_e, record_e],
            }),
        }
    }
}