rweb 0.15.0

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

use rweb::{openapi::*, *};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

#[derive(Debug, Serialize, Deserialize, Schema)]
#[schema(component = "One")]
pub struct One {}

#[derive(Debug, Serialize, Deserialize, Schema)]
#[schema(component = "Two")]
pub struct Two {}

#[derive(Debug, Serialize, Deserialize, Schema)]
#[schema(component = "GenericStruct")]
struct GenericStruct<A, B> {
    a: A,
    b: HashMap<String, B>,
}

#[get("/")]
fn test_r(
    _: Query<GenericStruct<Option<String>, u64>>,
    _: Json<Vec<GenericStruct<Vec<Two>, Option<GenericStruct<Option<One>, One>>>>>,
) -> String {
    String::new()
}

#[test]
fn test_multi_generics_compile() {
    let (spec, _) = openapi::spec().build(|| test_r());
    let schemas = &spec.components.as_ref().unwrap().schemas;
    println!("{}", serde_yaml::to_string(&schemas).unwrap());
    for (name, _) in schemas {
        assert!(name
            .chars()
            .all(|c| c.is_alphanumeric() || c == '.' || c == '_' || c == '-'))
    }
    assert!(schemas.contains_key("One"));
    assert!(schemas.contains_key("Two"));
    assert!(schemas.contains_key("GenericStruct-string_Opt_uinteger-"));
    assert!(schemas.contains_key("One_Opt"));
    assert!(schemas.contains_key("GenericStruct-One_Opt_One-_Opt"));
    macro_rules! component {
        ($cn:expr) => {
            match schemas.get($cn) {
                Some(ObjectOrReference::Object(s)) => s,
                Some(..) => panic!("Component schema can't be a reference"),
                None => panic!("No component schema for {}", $cn),
            }
        };
    }
    assert_eq!(
        &component!("GenericStruct-One_Opt_One-_Opt").nullable,
        &Some(true)
    );
    assert_eq!(
        &component!("GenericStruct-One_Opt_One-_Opt").properties["a"],
        &ComponentOrInlineSchema::Component {
            name: rt::Cow::Borrowed("One_Opt")
        }
    );
}