feat: Make application async

This commit is contained in:
2026-09-25 05:39:55 +02:00
parent 344f345854
commit 27f6557197
9 changed files with 290 additions and 101 deletions
+21 -9
View File
@@ -1,5 +1,6 @@
use schemars::JsonSchema;
use serde::{Deserialize, Deserializer, Serialize};
use tokio::runtime::Handle;
use crate::get_talos_path;
@@ -11,7 +12,7 @@ where
let path = get_talos_path().join("schematics").join(name);
let content = std::fs::read_to_string(path).unwrap().trim().to_owned();
let client = reqwest::blocking::ClientBuilder::new()
let client = reqwest::ClientBuilder::new()
.user_agent(format!(
"{}/{}",
std::env!("CARGO_PKG_NAME"),
@@ -20,19 +21,30 @@ where
.build()
.unwrap();
let res = client
.post("https://factory.talos.dev/schematics")
.body(content)
.send()
.map_err(serde::de::Error::custom)?;
#[derive(Debug, Deserialize)]
struct Response {
id: String,
}
let response: Response = serde_json::from_str(&res.text().map_err(serde::de::Error::custom)?)
.map_err(serde::de::Error::custom)?;
// We can't use async directly inside a custom deserializer, and using the blocking client also
// does not work as it will try to start tokio inside of tokio.
// So we have do this to work around it.
let response = tokio::task::block_in_place(|| {
Handle::current().block_on(async {
let res = client
.post("https://factory.talos.dev/schematics")
.body(content)
.send()
.await
.map_err(serde::de::Error::custom)?;
let response: Response =
serde_json::from_str(&res.text().await.map_err(serde::de::Error::custom)?)
.map_err(serde::de::Error::custom)?;
Ok(response)
})
})?;
Ok(response.id)
}