lazybe 0.2.1

Handy CRUD boilerplate macros and utils for Rust backend
Documentation
use lazybe_macros::typed_uri;
use serde::{Deserialize, Serialize};

#[test]
fn static_uri() {
    typed_uri!(Root, "");
    assert_eq!(Root::AXUM_PATH, "/");
    assert_eq!(Root::AXUM_PATH, Root::new_uri());

    typed_uri!(Ping, "ping");
    assert_eq!(Ping::AXUM_PATH, "/ping");
    assert_eq!(Ping::AXUM_PATH, Ping::new_uri());

    typed_uri!(Healthcheck, "api" / "health");
    assert_eq!(Healthcheck::AXUM_PATH, "/api/health");
    assert_eq!(Healthcheck::AXUM_PATH, Healthcheck::new_uri());

    typed_uri!(Book, "api" / "v1" / "books");
    assert_eq!(Book::AXUM_PATH, "/api/v1/books");
    assert_eq!(Book::AXUM_PATH, Book::new_uri());
}

#[test]
fn dynamic_uri() {
    typed_uri!(RootBook, (book_id: String));
    assert_eq!(RootBook::AXUM_PATH, "/{book_id}");
    assert_eq!(RootBook::new_uri("my-book".to_string()), "/my-book");

    typed_uri!(Book, "api" / "books" / (book_id: u32));
    assert_eq!(Book::AXUM_PATH, "/api/books/{book_id}");
    assert_eq!(Book::new_uri(123), "/api/books/123");

    typed_uri!(BookAuthor, "api" / "books" / (book_id: u32) / "authors");
    assert_eq!(BookAuthor::AXUM_PATH, "/api/books/{book_id}/authors");
    assert_eq!(BookAuthor::new_uri(123), "/api/books/123/authors");

    typed_uri!(BookEditiion, "api" / "books" / (book_id: u32) / "editions" / (edition: u8));
    assert_eq!(BookEditiion::AXUM_PATH, "/api/books/{book_id}/editions/{edition}");
    assert_eq!(BookEditiion::new_uri(123, 1), "/api/books/123/editions/1");

    typed_uri!(MovieEpisode, "api" / "movies" / (movie_id: u32) / (episode: u8));
    assert_eq!(MovieEpisode::AXUM_PATH, "/api/movies/{movie_id}/{episode}");
    assert_eq!(MovieEpisode::new_uri(123, 2), "/api/movies/123/2");
}

#[test]
fn query_param_uri() {
    #[derive(Deserialize, Serialize)]
    struct BookQuery {
        author: Option<String>,
        year_published: Option<u16>,
    }

    typed_uri!(Book, "api" / "books" ? Option<BookQuery>);
    assert_eq!(Book::AXUM_PATH, "/api/books");
    assert_eq!(Book::new_uri(None), "/api/books");
    assert_eq!(
        Book::new_uri(Some(BookQuery {
            author: None,
            year_published: None
        })),
        "/api/books"
    );
    assert_eq!(
        Book::new_uri(Some(BookQuery {
            author: Some("writer&friends".to_string()),
            year_published: None
        })),
        "/api/books?author=writer%26friends"
    );
    assert_eq!(
        Book::new_uri(Some(BookQuery {
            author: None,
            year_published: Some(2000)
        })),
        "/api/books?year_published=2000"
    );
    assert_eq!(
        Book::new_uri(Some(BookQuery {
            author: Some("writer&friends".to_string()),
            year_published: Some(2000)
        })),
        "/api/books?author=writer%26friends&year_published=2000"
    );
}