rweb 0.15.0

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

use rweb::*;
use serde::{Deserialize, Serialize};
use std::borrow::Cow;

#[derive(Debug, Serialize, Deserialize, Schema)]
#[schema(component = "TestStruct")]
struct TestStruct {
    afield: String,
    optfield: Option<String>,
}

#[get("/")]
fn test_struct_r(_: Query<TestStruct>) -> String {
    String::new()
}

#[test]
fn test_struct() {
    let (spec, _) = openapi::spec().build(|| test_struct_r());
    let schema = match spec
        .components
        .as_ref()
        .unwrap()
        .schemas
        .get("TestStruct")
        .unwrap()
    {
        openapi::ObjectOrReference::Object(s) => s,
        _ => panic!(),
    };
    println!("{}", serde_yaml::to_string(&schema).unwrap());
    assert!(schema.required.contains(&Cow::Borrowed("afield")));
    assert!(!schema.required.contains(&Cow::Borrowed("optfield")));
}

#[derive(Debug, Serialize, Deserialize, Schema)]
#[schema(component = "TestEnum")]
enum TestEnum {
    AThing {
        afield: String,
    },
    MaybeThing {
        optfield: Option<String>,
    },
    TwoThings {
        afield: String,
        optfield: Option<String>,
    },
}

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

#[test]
fn test_enum() {
    let (spec, _) = openapi::spec().build(|| test_enum_r());
    let schema = match spec
        .components
        .as_ref()
        .unwrap()
        .schemas
        .get("TestEnum")
        .unwrap()
    {
        openapi::ObjectOrReference::Object(s) => s,
        _ => panic!(),
    };
    println!("{}", serde_yaml::to_string(&schema).unwrap());
    for variant in &schema.one_of {
        match variant {
            openapi::ComponentOrInlineSchema::Inline(vs) => {
                if vs.properties.contains_key(&Cow::Borrowed("afield")) {
                    assert!(vs.required.contains(&Cow::Borrowed("afield")));
                }
                if vs.properties.contains_key(&Cow::Borrowed("optfield")) {
                    assert!(!vs.required.contains(&Cow::Borrowed("optfield")));
                }
            }
            _ => panic!(),
        }
    }
}