jfsm 0.1.5

A command-line tool to read file system metadata then return it in JSON format (output and errors).
Documentation
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;

/// Represents any JSON object
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Arg(Value);

/// Represents a String argument
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StringArg(String);

/// Represents a Number argument (per JSON specifications)
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NumberArg(serde_json::Number);

/// Represents a Boolean argument
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BooleanArg(bool);

/// Represents a Null argument
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NullArg;

/// Represents request parameters as a Map of String key and Arg value
pub type Params = HashMap<String, Arg>;

/// Represents a request with method, parameters, timestamp, and version
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Request {
    /// Request method used
    pub method: String,
    
    /// Request parameters
    pub params: Params,
    
    /// Timestamp in nanoseconds since epoch
    pub ts: serde_json::Number,
    
    /// Crate version
    pub version: String,
}

impl Request {
    /// Returns the serialized representation of the Request struct
    pub fn to_json(&self) -> Result<String, serde_json::Error> {
        serde_json::to_string(self)
    }
}

impl From<Value> for Arg {
    fn from(value: Value) -> Self {
        Arg(value)
    }
}

impl From<String> for Arg {
    fn from(value: String) -> Self {
        Arg(Value::String(value))
    }
}

impl From<serde_json::Number> for Arg {
    fn from(value: serde_json::Number) -> Self {
        Arg(Value::Number(value))
    }
}

impl From<bool> for Arg {
    fn from(value: bool) -> Self {
        Arg(Value::Bool(value))
    }
}

impl From<()> for Arg {
    fn from(_value: ()) -> Self {
        Arg(Value::Null)
    }
}