hakoniwa_code_runner/
config.rs

1use 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}