diff --git a/.dockerignore b/.dockerignore index 075760b..3a27f2c 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,6 @@ .github spec/node_modules http -target +*target README.md .gitignore diff --git a/.gitignore b/.gitignore index 4b3f7f3..6884017 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ -/target +*target spec/node_modules diff --git a/.idea/simplify_truths.iml b/.idea/simplify_truths.iml index cf84ae4..6ab467f 100644 --- a/.idea/simplify_truths.iml +++ b/.idea/simplify_truths.iml @@ -2,7 +2,9 @@ + + diff --git a/Cargo.lock b/Cargo.lock index 3331e72..5107e36 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -135,6 +135,14 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "derive" +version = "1.0.0" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "fnv" version = "1.0.7" @@ -547,6 +555,7 @@ name = "simplify_truths" version = "2.0.0" dependencies = [ "axum", + "derive", "nom", "serde", "tokio", diff --git a/Cargo.toml b/Cargo.toml index 85525fb..93f4eda 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,3 +18,6 @@ tower-http = { version = "0.5.2", features = ["cors", "trace"] } # Logging tracing = "0.1.40" tracing-subscriber = "0.3.18" + +# Derive macros +derive = { path = "derive" } diff --git a/Dockerfile b/Dockerfile index 6a50398..c671e3e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,13 +2,13 @@ # builds the project, and then copies the built binary to a new image. FROM rust:1.79 as build -LABEL authors="Martin Berg Alstad" RUN USER=root cargo new --bin simplify_truths WORKDIR /simplify_truths COPY ./Cargo.lock ./Cargo.lock COPY ./Cargo.toml ./Cargo.toml +COPY ./derive ./derive # this build step will cache your dependencies RUN cargo build --release @@ -29,6 +29,7 @@ RUN USER=root npm install -g @typespec/compiler && npm install -g @redocly/cli RUN npm run tsp-compile && npm run redoc-build FROM debian +LABEL authors="Martin Berg Alstad" # copy the build artifact from the build stage COPY --from=build /simplify_truths/target/release/simplify_truths . diff --git a/derive/Cargo.lock b/derive/Cargo.lock new file mode 100644 index 0000000..25477dc --- /dev/null +++ b/derive/Cargo.lock @@ -0,0 +1,46 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "derive" +version = "1.0.0" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "2.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" diff --git a/derive/Cargo.toml b/derive/Cargo.toml new file mode 100644 index 0000000..f7aed7f --- /dev/null +++ b/derive/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "derive" +version = "1.0.0" +edition = "2021" + +[lib] +proc-macro = true + +[dependencies] +syn = "2.0.66" +quote = "1.0.36" diff --git a/derive/src/lib.rs b/derive/src/lib.rs new file mode 100644 index 0000000..3dbc4b4 --- /dev/null +++ b/derive/src/lib.rs @@ -0,0 +1,25 @@ +extern crate proc_macro; + +use proc_macro::TokenStream; +use quote::quote; +use syn::{DeriveInput, parse_macro_input}; + +#[proc_macro_derive(IntoResponse)] +pub fn into_response_derive(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + into_response_derive_impl(input) +} + +fn into_response_derive_impl(input: DeriveInput) -> TokenStream { + let name = &input.ident; + + let expanded = quote! { + impl IntoResponse for #name { + fn into_response(self) -> Response { + BaseResponse::create(self) + } + } + }; + + TokenStream::from(expanded) +} diff --git a/src/routing/response.rs b/src/routing/response.rs index 430c6c1..c7b8a20 100644 --- a/src/routing/response.rs +++ b/src/routing/response.rs @@ -1,6 +1,7 @@ use axum::Json; use axum::response::{IntoResponse, Response}; use serde::Serialize; +use derive::IntoResponse; use crate::expressions::expression::Expression; use crate::expressions::simplify::Law; @@ -45,7 +46,7 @@ impl Operation { } } -#[derive(Serialize)] +#[derive(Serialize, IntoResponse)] #[serde(rename_all = "camelCase")] pub struct SimplifyResponse { pub before: String, @@ -56,33 +57,14 @@ pub struct SimplifyResponse { pub truth_table: Option, } -// TODO derive macro -impl IntoResponse for SimplifyResponse { - fn into_response(self) -> Response { - BaseResponse::create(self) - } -} - -#[derive(Serialize)] +#[derive(Serialize, IntoResponse)] #[serde(rename_all = "camelCase")] pub struct IsLegalResponse { pub is_legal: bool, } -impl IntoResponse for IsLegalResponse { - fn into_response(self) -> Response { - BaseResponse::create(self) - } -} - -#[derive(Serialize)] +#[derive(Serialize, IntoResponse)] #[serde(rename_all = "camelCase")] pub struct TruthTableResponse { pub truth_table: TruthTable, -} - -impl IntoResponse for TruthTableResponse { - fn into_response(self) -> Response { - BaseResponse::create(self) - } } \ No newline at end of file