hakoniwa_code_runner/
config.rs1use anyhow::Result;
2use handlebars::Handlebars;
3use lazy_static::lazy_static;
4use serde::Deserialize;
5use std::collections::HashMap;
6
7use crate::contrib::handlebars::fs_read_to_string_helper;
8
9lazy_static! {
10 static ref SANDBOX_POLICY_HANDLEBARS: Handlebars<'static> = {
11 let mut handlebars = Handlebars::new();
12 handlebars.register_helper("fs_read_to_string", Box::new(fs_read_to_string_helper));
13 handlebars
14 };
15}
16
17#[derive(Deserialize, Default, Debug)]
18#[serde(deny_unknown_fields)]
19pub struct ServerConfig {
20 #[serde(default = "ServerConfig::default_ip")]
21 pub(crate) ip: String,
22 #[serde(default = "ServerConfig::default_port")]
23 pub(crate) port: u16,
24}
25
26impl ServerConfig {
27 fn default_ip() -> String {
28 String::from("127.0.0.1")
29 }
30
31 fn default_port() -> u16 {
32 8080
33 }
34}
35
36#[derive(Deserialize, Default, Debug)]
37#[serde(deny_unknown_fields)]
38pub struct LanguageCommandConfig {
39 pub(crate) command: Vec<String>,
40 pub(crate) sandbox: String,
41}
42
43#[derive(Deserialize, Default, Debug)]
44#[serde(deny_unknown_fields)]
45pub struct LanguageConfig {
46 pub(crate) name: String,
47 pub(crate) compile: Option<LanguageCommandConfig>,
48 pub(crate) execute: LanguageCommandConfig,
49}
50
51#[derive(Deserialize, Default, Debug)]
52#[serde(deny_unknown_fields)]
53pub struct AppConfig {
54 #[serde(default, rename = "server")]
55 pub(crate) server: ServerConfig,
56 #[serde(rename = "lang")]
57 pub(crate) languages: HashMap<String, LanguageConfig>,
58}
59
60impl AppConfig {
61 #[allow(clippy::should_implement_trait)]
62 pub fn from_str(data: &str) -> Result<Self> {
63 let data = SANDBOX_POLICY_HANDLEBARS.render_template(data, &())?;
64 let policy: Self = toml::from_str(&data)?;
65 Ok(policy)
66 }
67}