rweb 0.15.0

Yet another web server framework for rust
Documentation
#![cfg(feature = "openapi")]

use rweb::*;
use serde::{Deserialize, Serialize};
use serde_yaml;

#[derive(Debug, Serialize, Deserialize, Schema)]
#[schema(component = "EExttagged")]
enum EExttagged {
    A(String),
    B(usize),
    Stru { field: String },
    Plain,
}

#[derive(Debug, Serialize, Deserialize, Schema)]
#[serde(tag = "tag")]
#[schema(component = "EInttagged")]
enum EInttagged {
    Stru { field: String },
    Plain,
}

#[derive(Debug, Serialize, Deserialize, Schema)]
#[serde(tag = "tag", content = "content")]
#[schema(component = "EAdjtagged")]
enum EAdjtagged {
    A(String),
    B(usize),
    Stru { field: String },
    Plain,
}

#[derive(Debug, Serialize, Deserialize, Schema)]
#[serde(untagged)]
#[schema(component = "EUntagged")]
enum EUntagged {
    A(String),
    B(usize),
    Stru { field: String },
}

#[derive(Debug, Serialize, Deserialize, Schema)]
struct Enums {
    ext: EExttagged,
    adj: EAdjtagged,
    int: EInttagged,
    unt: EUntagged,
}

#[get("/")]
fn index(_: Json<Enums>) -> String {
    String::new()
}

#[test]
fn description() {
    let (spec, _) = openapi::spec().build(|| {
        //
        index()
    });

    println!("{}", serde_yaml::to_string(&spec).unwrap());
    let schemas = &spec.components.as_ref().unwrap().schemas;
    macro_rules! component {
        ($cn:expr) => {
            match schemas.get($cn) {
                Some(openapi::ObjectOrReference::Object(s)) => s,
                Some(..) => panic!("Component schema can't be a reference"),
                None => panic!("No component schema for {}", $cn),
            }
        };
    }
    println!("{}", serde_yaml::to_string(&EExttagged::B(55)).unwrap());
    println!("{}", serde_yaml::to_string(&EExttagged::Plain).unwrap());
    let schema = component!("EExttagged");
    assert_eq!(schema.one_of.len(), 4);
    assert_eq!(
        schema.one_of[0].unwrap().unwrap().schema_type,
        Some(openapi::Type::Object)
    );
    assert_eq!(schema.one_of[0].unwrap().unwrap().required, vec!["A"]);
    assert_eq!(
        schema.one_of[0].unwrap().unwrap().properties["A"]
            .unwrap()
            .unwrap()
            .schema_type,
        Some(openapi::Type::String)
    );
    assert_eq!(
        schema.one_of[1].unwrap().unwrap().schema_type,
        Some(openapi::Type::Object)
    );
    assert_eq!(schema.one_of[1].unwrap().unwrap().required, vec!["B"]);
    assert_eq!(
        schema.one_of[1].unwrap().unwrap().properties["B"]
            .unwrap()
            .unwrap()
            .schema_type,
        Some(openapi::Type::Integer)
    );
    assert_eq!(
        schema.one_of[2].unwrap().unwrap().schema_type,
        Some(openapi::Type::Object)
    );
    assert_eq!(schema.one_of[2].unwrap().unwrap().required, vec!["Stru"]);
    assert_eq!(
        schema.one_of[2].unwrap().unwrap().properties["Stru"]
            .unwrap()
            .unwrap()
            .schema_type,
        Some(openapi::Type::Object)
    );
    assert_eq!(
        schema.one_of[3].unwrap().unwrap().schema_type,
        Some(openapi::Type::String)
    );
    assert_eq!(
        schema.one_of[3].unwrap().unwrap().enum_values,
        vec!["Plain"]
    );
    let schema = component!("EInttagged");
    assert_eq!(schema.one_of.len(), 2);
    assert_eq!(
        schema.one_of[0].unwrap().unwrap().schema_type,
        Some(openapi::Type::Object)
    );
    assert_eq!(
        schema.one_of[0].unwrap().unwrap().required,
        vec!["field", "tag"]
    );
    assert_eq!(
        schema.one_of[0].unwrap().unwrap().properties["field"]
            .unwrap()
            .unwrap()
            .schema_type,
        Some(openapi::Type::String)
    );
    assert_eq!(
        schema.one_of[0].unwrap().unwrap().properties["tag"]
            .unwrap()
            .unwrap()
            .schema_type,
        Some(openapi::Type::String)
    );
    assert_eq!(
        schema.one_of[0].unwrap().unwrap().properties["tag"]
            .unwrap()
            .unwrap()
            .enum_values,
        vec!["Stru"]
    );
    assert_eq!(
        schema.one_of[1].unwrap().unwrap().schema_type,
        Some(openapi::Type::Object)
    );
    assert_eq!(schema.one_of[1].unwrap().unwrap().required, vec!["tag"]);
    assert_eq!(
        schema.one_of[1].unwrap().unwrap().properties["tag"]
            .unwrap()
            .unwrap()
            .schema_type,
        Some(openapi::Type::String)
    );
    assert_eq!(
        schema.one_of[1].unwrap().unwrap().properties["tag"]
            .unwrap()
            .unwrap()
            .enum_values,
        vec!["Plain"]
    );
    let schema = component!("EAdjtagged");
    assert_eq!(schema.one_of.len(), 4);
    for s in &schema.one_of {
        assert_eq!(s.unwrap().unwrap().schema_type, Some(openapi::Type::Object));
        assert_eq!(
            s.unwrap().unwrap().properties["tag"]
                .unwrap()
                .unwrap()
                .schema_type,
            Some(openapi::Type::String)
        );
    }
    assert_eq!(
        schema.one_of[0].unwrap().unwrap().required,
        vec!["tag", "content"]
    );
    assert_eq!(
        schema.one_of[0].unwrap().unwrap().properties["tag"]
            .unwrap()
            .unwrap()
            .enum_values,
        vec!["A"]
    );
    assert_eq!(
        schema.one_of[0].unwrap().unwrap().properties["content"]
            .unwrap()
            .unwrap()
            .schema_type,
        Some(openapi::Type::String)
    );
    assert_eq!(
        schema.one_of[1].unwrap().unwrap().required,
        vec!["tag", "content"]
    );
    assert_eq!(
        schema.one_of[1].unwrap().unwrap().properties["tag"]
            .unwrap()
            .unwrap()
            .enum_values,
        vec!["B"]
    );
    assert_eq!(
        schema.one_of[1].unwrap().unwrap().properties["content"]
            .unwrap()
            .unwrap()
            .schema_type,
        Some(openapi::Type::Integer)
    );
    assert_eq!(
        schema.one_of[2].unwrap().unwrap().required,
        vec!["tag", "content"]
    );
    assert_eq!(
        schema.one_of[2].unwrap().unwrap().properties["tag"]
            .unwrap()
            .unwrap()
            .enum_values,
        vec!["Stru"]
    );
    assert_eq!(
        schema.one_of[2].unwrap().unwrap().properties["content"]
            .unwrap()
            .unwrap()
            .schema_type,
        Some(openapi::Type::Object)
    );
    assert_eq!(schema.one_of[3].unwrap().unwrap().required, vec!["tag"]);
    assert_eq!(
        schema.one_of[3].unwrap().unwrap().properties["tag"]
            .unwrap()
            .unwrap()
            .enum_values,
        vec!["Plain"]
    );
    let schema = component!("EUntagged");
    assert_eq!(schema.one_of.len(), 3);
    assert_eq!(
        schema.one_of[0].unwrap().unwrap().schema_type,
        Some(openapi::Type::String)
    );
    assert_eq!(
        schema.one_of[1].unwrap().unwrap().schema_type,
        Some(openapi::Type::Integer)
    );
    assert_eq!(
        schema.one_of[2].unwrap().unwrap().schema_type,
        Some(openapi::Type::Object)
    );
}