93 lines
2.9 KiB
Rust
Raw Normal View History

use axum::{Router, routing::get};
2024-06-05 22:09:12 +02:00
use axum::extract::{Path, Query};
use axum::http::StatusCode;
use axum::response::{IntoResponse, Response};
2024-06-16 20:19:03 +02:00
use serde::{Deserialize};
2024-06-05 22:09:12 +02:00
use crate::expressions::expression::Expression;
use crate::expressions::truth_table::{Hide, Sort, TruthTable, TruthTableOptions};
2024-06-14 16:34:11 +02:00
use crate::routing::error::{Error, ErrorKind};
use crate::routing::response::SimplifyResponse;
2024-06-16 20:19:03 +02:00
use crate::utils::serialize::{ret_true, deserialize_bool};
2024-06-05 22:09:12 +02:00
pub fn router() -> Router<()> {
Router::new()
.nest("/simplify",
Router::new()
.route("/:exp", get(simplify))
.route("/table/:exp", get(simplify_and_table)),
)
}
#[derive(Deserialize)]
struct SimplifyOptions {
2024-06-16 20:19:03 +02:00
#[serde(
default = "ret_true",
deserialize_with = "deserialize_bool"
)]
2024-06-05 22:09:12 +02:00
simplify: bool,
2024-06-16 20:19:03 +02:00
#[serde(default = "ret_true")]
case_sensitive: bool, // TODO: Implement case sensitivity
2024-06-05 22:09:12 +02:00
}
async fn simplify(Path(path): Path<String>, Query(query): Query<SimplifyOptions>) -> Response {
match Expression::try_from(path.as_str()) {
Ok(mut expression) => {
let before = expression.to_string();
let mut operations = vec![];
if query.simplify {
(expression, operations) = expression.simplify();
}
SimplifyResponse {
before,
after: expression.to_string(),
operations,
expression,
truth_table: None,
}.into_response()
}
Err(error) => {
(StatusCode::BAD_REQUEST, Error::new(error.to_string(), ErrorKind::InvalidExpression)).into_response()
}
}
2024-06-05 22:09:12 +02:00
}
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
struct SimplifyAndTableQuery {
#[serde(flatten)]
simplify_options: SimplifyOptions,
#[serde(default)]
sort: Sort,
#[serde(default)]
hide: Hide,
2024-06-16 20:19:03 +02:00
#[serde(default)]
hide_intermediate_steps: bool, // TODO
}
async fn simplify_and_table(Path(path): Path<String>, Query(query): Query<SimplifyAndTableQuery>) -> Response {
match Expression::try_from(path.as_str()) {
Ok(mut expression) => {
let before = expression.to_string();
let mut operations = vec![];
if query.simplify_options.simplify {
(expression, operations) = expression.simplify();
}
let truth_table = TruthTable::new(&expression, TruthTableOptions {
sort: query.sort,
hide: query.hide,
});
SimplifyResponse {
before,
after: expression.to_string(),
operations,
expression,
truth_table: Some(truth_table),
}.into_response()
}
Err(error) => {
(StatusCode::BAD_REQUEST, Error::new(error.to_string(), ErrorKind::InvalidExpression)).into_response()
2024-06-13 11:34:57 +02:00
}
}
2024-06-05 22:09:12 +02:00
}