d721276de678d503d8b6ddd49d41a227018b0636
4 use serde
::Deserialize
;
5 use percent_encoding
::percent_decode_str
;
6 use actix_web
::{get
, web
, App
, HttpServer
, HttpResponse
, Responder
, ResponseError
, Result
};
7 use actix_web
::body
::BoxBody
;
8 use actix_web
::http
::StatusCode
;
9 use image
::{ImageBuffer
, ColorType
, Rgb
, RgbImage
, write_buffer_with_format
};
10 use image
::ImageOutputFormat
::Png
;
11 use image
::imageops
::{FilterType
, resize
};
13 #[derive(Deserialize)]
19 struct ImageError(image
::ImageError
);
21 impl Display
for ImageError
{
22 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
23 write
!(f
, "{}", &self.0)
27 impl ResponseError
for ImageError
{
28 fn status_code(&self) -> StatusCode
{
29 StatusCode
::INTERNAL_SERVER_ERROR
32 fn error_response(&self) -> HttpResponse
<BoxBody
> {
33 HttpResponse
::InternalServerError().fin
ish
()
37 struct StringToRgb
<'a
> {
38 iter
: Box
<dyn Iterator
<Item
= char> + 'a
>
41 impl<'a
> StringToRgb
<'a
> {
42 fn new(text
: &'a
str) -> StringToRgb
{
43 StringToRgb
{ iter
: Box
::new(text
.chars()) }
47 impl Iterator
for StringToRgb
<'_
> {
49 fn next(&mut self) -> Option
<Rgb
<u8>> {
50 let r
= self.iter
.next();
51 let g
= self.iter
.next();
52 let b
= self.iter
.next();
53 println
!("{:?} {:?} {:?}", r
, g
, b
);
54 if r
.is
_none
() && g
.is
_none
() && b
.is
_none
() {
58 Some(Rgb([r
.unwrap
_or
('
\0'
) as u8, g
.unwrap
_or
('
\0'
) as u8, b
.unwrap
_or
('
\0'
) as u8]))
63 fn to_imageresult
<T
> (result
: Result
<T
, image
::ImageError
>) -> Result
<T
, ImageError
> {
66 Err(e
) => Err(ImageError(e
))
70 #[get("/hello/{name}")]
71 async
fn greet(name
: web
::Path
<String
>) -> impl Responder
{
72 format
!("Hello {name}!")
76 async
fn img_gen(data
: web
::Path
<Data
>) -> Result
<impl Responder
> {
77 let mut cursor
= Cursor
::new(Vec
::new());
78 let mut img
: RgbImage
= ImageBuffer
::new(32, 32);
79 let mut pixels
= img
.pixels_mut();
81 for sp
in StringToRgb
::new(&percent_decode_str(&data
.data
).decode_utf8_lossy()) {
82 let mut dp
= pixels
.next().unwrap
();
87 let img
= resize(&img
, 512, 512, FilterType
::Nearest
);
88 to_imageresult(write_buffer_with_format(&mut cursor
, &img
, 512, 512, ColorType
::Rgb8
, Png
))?
;
89 Ok(HttpResponse
::build(StatusCode
::OK
)
90 .content_type("image/png")
91 .body(cursor
.into
_inner
()))
94 #[actix_web::main] // or #[tokio::main]
95 async
fn main() -> std
::io
::Result
<()> {
97 App
::new().service(greet
).service(img_gen
)
99 .bind(("127.0.0.1", 8080))?