actrpc-core 0.1.0

Core types and traits for ActRPC.
Documentation
use crate::{
    action::{NoOk, NoParams},
    descriptor::{
        traits::{DescribeOk, DescribeParams, DescribeValue},
        types::{
            FieldDescriptor, NestedObjectDescriptor, OkDescriptor, ParamsDescriptor,
            PrimitiveDescriptor, ValueDescriptor,
        },
    },
    json_rpc::{
        JsonRpcError, JsonRpcErrorResponse, JsonRpcId, JsonRpcParams, JsonRpcResponse,
        JsonRpcSuccessResponse,
    },
};

macro_rules! impl_integer_value {
    ($($ty:ty),* $(,)?) => {
        $(
            impl DescribeValue for $ty {
                fn describe_value() -> ValueDescriptor {
                    ValueDescriptor::Primitive(PrimitiveDescriptor::Integer)
                }
            }

            impl DescribeParams for $ty {
                fn describe_params() -> Option<ParamsDescriptor> {
                    Some(ParamsDescriptor::Value(<Self as DescribeValue>::describe_value()))
                }
            }

            impl DescribeOk for $ty {
                fn describe_ok() -> Option<OkDescriptor> {
                    Some(<Self as DescribeValue>::describe_value())
                }
            }
        )*
    };
}

macro_rules! impl_number_value {
    ($($ty:ty),* $(,)?) => {
        $(
            impl DescribeValue for $ty {
                fn describe_value() -> ValueDescriptor {
                    ValueDescriptor::Primitive(PrimitiveDescriptor::Number)
                }
            }

            impl DescribeParams for $ty {
                fn describe_params() -> Option<ParamsDescriptor> {
                    Some(ParamsDescriptor::Value(<Self as DescribeValue>::describe_value()))
                }
            }

            impl DescribeOk for $ty {
                fn describe_ok() -> Option<OkDescriptor> {
                    Some(<Self as DescribeValue>::describe_value())
                }
            }
        )*
    };
}

impl DescribeValue for bool {
    fn describe_value() -> ValueDescriptor {
        ValueDescriptor::Primitive(PrimitiveDescriptor::Bool)
    }
}

impl DescribeParams for bool {
    fn describe_params() -> Option<ParamsDescriptor> {
        Some(ParamsDescriptor::Value(
            <Self as DescribeValue>::describe_value(),
        ))
    }
}

impl DescribeOk for bool {
    fn describe_ok() -> Option<OkDescriptor> {
        Some(<Self as DescribeValue>::describe_value())
    }
}

impl DescribeValue for String {
    fn describe_value() -> ValueDescriptor {
        ValueDescriptor::Primitive(PrimitiveDescriptor::String)
    }
}

impl DescribeParams for String {
    fn describe_params() -> Option<ParamsDescriptor> {
        Some(ParamsDescriptor::Value(
            <Self as DescribeValue>::describe_value(),
        ))
    }
}

impl DescribeOk for String {
    fn describe_ok() -> Option<OkDescriptor> {
        Some(<Self as DescribeValue>::describe_value())
    }
}

impl DescribeValue for str {
    fn describe_value() -> ValueDescriptor {
        ValueDescriptor::Primitive(PrimitiveDescriptor::String)
    }
}

impl_integer_value!(
    u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize
);
impl_number_value!(f32, f64);

impl<T> DescribeValue for Vec<T>
where
    T: DescribeValue,
{
    fn describe_value() -> ValueDescriptor {
        ValueDescriptor::Array(Box::new(T::describe_value()))
    }
}

impl<T> DescribeParams for Vec<T>
where
    T: DescribeValue,
{
    fn describe_params() -> Option<ParamsDescriptor> {
        Some(ParamsDescriptor::Value(
            <Self as DescribeValue>::describe_value(),
        ))
    }
}

impl<T> DescribeOk for Vec<T>
where
    T: DescribeValue,
{
    fn describe_ok() -> Option<OkDescriptor> {
        Some(<Self as DescribeValue>::describe_value())
    }
}

impl DescribeValue for serde_json::Value {
    fn describe_value() -> ValueDescriptor {
        ValueDescriptor::Any
    }
}

impl DescribeParams for serde_json::Value {
    fn describe_params() -> Option<ParamsDescriptor> {
        Some(ParamsDescriptor::Value(ValueDescriptor::Any))
    }
}

impl DescribeOk for serde_json::Value {
    fn describe_ok() -> Option<OkDescriptor> {
        Some(ValueDescriptor::Any)
    }
}

impl DescribeValue for JsonRpcId {
    fn describe_value() -> ValueDescriptor {
        ValueDescriptor::OneOf(vec![
            ValueDescriptor::Primitive(PrimitiveDescriptor::String),
            ValueDescriptor::Primitive(PrimitiveDescriptor::Number),
            ValueDescriptor::Primitive(PrimitiveDescriptor::Null),
        ])
    }
}

impl DescribeParams for JsonRpcId {
    fn describe_params() -> Option<ParamsDescriptor> {
        Some(ParamsDescriptor::Value(
            <Self as DescribeValue>::describe_value(),
        ))
    }
}

impl DescribeOk for JsonRpcId {
    fn describe_ok() -> Option<OkDescriptor> {
        Some(<Self as DescribeValue>::describe_value())
    }
}

impl DescribeValue for JsonRpcParams {
    fn describe_value() -> ValueDescriptor {
        ValueDescriptor::OneOf(vec![
            ValueDescriptor::Array(Box::new(ValueDescriptor::Any)),
            ValueDescriptor::Map(Box::new(ValueDescriptor::Any)),
        ])
    }
}

impl DescribeParams for JsonRpcParams {
    fn describe_params() -> Option<ParamsDescriptor> {
        Some(ParamsDescriptor::Value(
            <Self as DescribeValue>::describe_value(),
        ))
    }
}

impl DescribeOk for JsonRpcParams {
    fn describe_ok() -> Option<OkDescriptor> {
        Some(<Self as DescribeValue>::describe_value())
    }
}

impl DescribeValue for JsonRpcError {
    fn describe_value() -> ValueDescriptor {
        ValueDescriptor::Object(NestedObjectDescriptor {
            fields: vec![
                FieldDescriptor {
                    name: "code".to_string(),
                    ty: ValueDescriptor::Primitive(PrimitiveDescriptor::Integer),
                },
                FieldDescriptor {
                    name: "message".to_string(),
                    ty: ValueDescriptor::Primitive(PrimitiveDescriptor::String),
                },
                FieldDescriptor {
                    name: "data".to_string(),
                    ty: ValueDescriptor::Any,
                },
            ],
        })
    }
}

impl DescribeParams for JsonRpcError {
    fn describe_params() -> Option<ParamsDescriptor> {
        Some(ParamsDescriptor::Value(
            <Self as DescribeValue>::describe_value(),
        ))
    }
}

impl DescribeOk for JsonRpcError {
    fn describe_ok() -> Option<OkDescriptor> {
        Some(<Self as DescribeValue>::describe_value())
    }
}

impl DescribeParams for NoParams {
    fn describe_params() -> Option<ParamsDescriptor> {
        None
    }
}

impl DescribeOk for NoOk {
    fn describe_ok() -> Option<OkDescriptor> {
        None
    }
}

impl<T> DescribeValue for std::collections::HashSet<T>
where
    T: DescribeValue,
{
    fn describe_value() -> ValueDescriptor {
        ValueDescriptor::Array(Box::new(T::describe_value()))
    }
}

impl<T> DescribeParams for std::collections::HashSet<T>
where
    T: DescribeValue,
{
    fn describe_params() -> Option<ParamsDescriptor> {
        Some(ParamsDescriptor::Value(
            <Self as DescribeValue>::describe_value(),
        ))
    }
}

impl<T> DescribeOk for std::collections::HashSet<T>
where
    T: DescribeValue,
{
    fn describe_ok() -> Option<OkDescriptor> {
        Some(<Self as DescribeValue>::describe_value())
    }
}

impl DescribeValue for JsonRpcSuccessResponse {
    fn describe_value() -> ValueDescriptor {
        ValueDescriptor::Object(NestedObjectDescriptor {
            fields: vec![
                FieldDescriptor {
                    name: "jsonrpc".to_string(),
                    ty: ValueDescriptor::Primitive(PrimitiveDescriptor::String),
                },
                FieldDescriptor {
                    name: "id".to_string(),
                    ty: <JsonRpcId as DescribeValue>::describe_value(),
                },
                FieldDescriptor {
                    name: "result".to_string(),
                    ty: ValueDescriptor::Any,
                },
            ],
        })
    }
}

impl DescribeParams for JsonRpcSuccessResponse {
    fn describe_params() -> Option<ParamsDescriptor> {
        Some(ParamsDescriptor::Value(
            <Self as DescribeValue>::describe_value(),
        ))
    }
}

impl DescribeOk for JsonRpcSuccessResponse {
    fn describe_ok() -> Option<OkDescriptor> {
        Some(<Self as DescribeValue>::describe_value())
    }
}

impl DescribeValue for JsonRpcErrorResponse {
    fn describe_value() -> ValueDescriptor {
        ValueDescriptor::Object(NestedObjectDescriptor {
            fields: vec![
                FieldDescriptor {
                    name: "jsonrpc".to_string(),
                    ty: ValueDescriptor::Primitive(PrimitiveDescriptor::String),
                },
                FieldDescriptor {
                    name: "id".to_string(),
                    ty: <JsonRpcId as DescribeValue>::describe_value(),
                },
                FieldDescriptor {
                    name: "error".to_string(),
                    ty: <JsonRpcError as DescribeValue>::describe_value(),
                },
            ],
        })
    }
}

impl DescribeParams for JsonRpcErrorResponse {
    fn describe_params() -> Option<ParamsDescriptor> {
        Some(ParamsDescriptor::Value(
            <Self as DescribeValue>::describe_value(),
        ))
    }
}

impl DescribeOk for JsonRpcErrorResponse {
    fn describe_ok() -> Option<OkDescriptor> {
        Some(<Self as DescribeValue>::describe_value())
    }
}

impl DescribeValue for JsonRpcResponse {
    fn describe_value() -> ValueDescriptor {
        ValueDescriptor::OneOf(vec![
            <JsonRpcSuccessResponse as DescribeValue>::describe_value(),
            <JsonRpcErrorResponse as DescribeValue>::describe_value(),
        ])
    }
}

impl DescribeParams for JsonRpcResponse {
    fn describe_params() -> Option<ParamsDescriptor> {
        Some(ParamsDescriptor::Value(
            <Self as DescribeValue>::describe_value(),
        ))
    }
}

impl DescribeOk for JsonRpcResponse {
    fn describe_ok() -> Option<OkDescriptor> {
        Some(<Self as DescribeValue>::describe_value())
    }
}