From 568de24ec8c9380dc9774c203947eb2cfe6d78d1 Mon Sep 17 00:00:00 2001 From: Lyle Mantooth Date: Sun, 14 May 2023 10:56:10 -0400 Subject: [PATCH] Make it a web service. --- Cargo.lock | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/main.rs | 38 ++++++++++++++++-- 3 files changed, 147 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6101229..ee07cac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -42,6 +42,17 @@ dependencies = [ "terminal_size", ] +[[package]] +name = "async-trait" +version = "0.1.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "atty" version = "0.2.14" @@ -59,6 +70,55 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "axum" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8175979259124331c1d7bf6586ee7e0da434155e4b2d48ec2c8386281d8df39" +dependencies = [ + "async-trait", + "axum-core", + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + [[package]] name = "backtrace" version = "0.3.67" @@ -121,6 +181,7 @@ name = "catscii" version = "0.1.0" dependencies = [ "artem", + "axum", "color-eyre", "image", "pretty-hex", @@ -790,6 +851,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "matchit" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" + [[package]] name = "memchr" version = "2.5.0" @@ -1213,6 +1280,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "rustversion" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" + [[package]] name = "ryu" version = "1.0.13" @@ -1288,6 +1361,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7f05c1d5476066defcdfacce1f52fc3cae3af1d3089727100c02ae92e5abbe0" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -1375,6 +1457,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "tempfile" version = "3.5.0" @@ -1503,6 +1591,28 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" @@ -1516,6 +1626,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", + "log", "pin-project-lite", "tracing-core", ] diff --git a/Cargo.toml b/Cargo.toml index 49aed75..d1d07c4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ edition = "2018" [dependencies] artem = { version = "=1.1.5", default-features = false } +axum = "0.6" color-eyre = "0.6" image = "0.24" pretty-hex = "0.3" diff --git a/src/main.rs b/src/main.rs index 3bbbe84..6627ba1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,36 @@ +use axum::{ + body::BoxBody, + http::header, + response::{IntoResponse, Response}, + routing::get, + Router, +}; +use reqwest::StatusCode; use serde::Deserialize; #[tokio::main] async fn main() { - let art = get_cat_ascii_art().await.unwrap(); - println!("{art}"); + let app = Router::new().route("/", get(root_get)); + + axum::Server::bind(&"0.0.0.0:8080".parse().unwrap()) + .serve(app.into_make_service()) + .await + .unwrap(); +} + +async fn root_get() -> Response { + match get_cat_ascii_art().await { + Ok(art) => ( + StatusCode::OK, + [(header::CONTENT_TYPE, "text/html; charset=utf-8")], + art, + ) + .into_response(), + Err(e) => { + println!("Something went wrong: {e}"); + (StatusCode::INTERNAL_SERVER_ERROR, "Something went wrong").into_response() + } + } } async fn get_cat_ascii_art() -> color_eyre::Result { @@ -34,7 +61,12 @@ async fn get_cat_ascii_art() -> color_eyre::Result { .await?; let image = image::load_from_memory(&image_bytes)?; - let ascii_art = artem::convert(image, artem::options::OptionBuilder::new().build()); + let ascii_art = artem::convert( + image, + artem::options::OptionBuilder::new() + .target(artem::options::TargetType::HtmlFile(true, true)) + .build(), + ); Ok(ascii_art) }