diff --git a/aiscript-runtime/src/config/mod.rs b/aiscript-runtime/src/config/mod.rs index fd379b8..5cd7c47 100644 --- a/aiscript-runtime/src/config/mod.rs +++ b/aiscript-runtime/src/config/mod.rs @@ -27,6 +27,24 @@ pub struct Config { pub auth: AuthConfig, #[serde(default)] pub sso: SsoConfig, + #[serde(default)] + pub network: NetworkConfig, +} + +#[derive(Debug, Deserialize, Default)] +pub struct NetworkConfig { + #[serde(default = "default_host")] + pub host: String, + #[serde(default = "default_port")] + pub port: u16, +} + +fn default_host() -> String { + "127.0.0.1".to_string() +} + +fn default_port() -> u16 { + 8080 } #[derive(Debug, Deserialize, Default)] diff --git a/aiscript-runtime/src/lib.rs b/aiscript-runtime/src/lib.rs index 0c188db..25e0e80 100644 --- a/aiscript-runtime/src/lib.rs +++ b/aiscript-runtime/src/lib.rs @@ -269,7 +269,11 @@ async fn run_server( // Add the fallback handler to the router router = router.fallback(handle_404); - let addr = SocketAddr::from(([0, 0, 0, 0], port)); + let addr = format!("{}:{}", config.network.host, port) + .parse::() + .unwrap(); + println!("Server listening on http://{}", addr); + let listener = TcpListener::bind(addr).await.unwrap(); match reload_rx { diff --git a/aiscript/src/main.rs b/aiscript/src/main.rs index 1700ee3..c8a85e9 100644 --- a/aiscript/src/main.rs +++ b/aiscript/src/main.rs @@ -31,8 +31,8 @@ enum Commands { #[arg(value_name = "FILE")] file: Option, /// The web server listening port. - #[arg(short, long, default_value_t = 8080)] - port: u16, + #[arg(short, long)] + port: Option, /// Reload the file on change #[arg(short, long, default_value_t = false)] reload: bool, @@ -53,7 +53,7 @@ async fn main() { let cli = AIScriptCli::parse(); match cli.command { Some(Commands::Serve { file, port, reload }) => { - println!("Server listening on port http://localhost:{}", port); + let port = port.unwrap_or(config.network.port); aiscript_runtime::run(file, port, reload).await; } Some(Commands::New { name }) => { diff --git a/examples/project.toml b/examples/project.toml index 8b90f8d..e656afe 100644 --- a/examples/project.toml +++ b/examples/project.toml @@ -1,3 +1,7 @@ +[network] +host = "0.0.0.0" +port = 5042 + [apidoc] enabled = true type = "swagger" diff --git a/examples/routes/nested/gist.ai b/examples/routes/nested/gist.ai index f41188f..11b668d 100644 --- a/examples/routes/nested/gist.ai +++ b/examples/routes/nested/gist.ai @@ -3,12 +3,18 @@ get /gists { return "gist"; } -get /gists/ { +get /gists/:id { """Get gist by id""" - return "gist: " + id; + path { + id: str, + } + return "gist: " + path.id; } -delete /gists/ { +delete /gists/:id { """Delete gist by id""" - return "delete gist: " + id; + path { + id: str, + } + return "delete gist: " + path.id; } \ No newline at end of file diff --git a/examples/routes/poc.ai b/examples/routes/poc.ai index 64fe639..046a434 100644 --- a/examples/routes/poc.ai +++ b/examples/routes/poc.ai @@ -5,9 +5,9 @@ route /poc { query { """hello content""" @string(min_len=3, max_len=30) - content: str + content: str, """hello age""" - age: int = 18 + age: int = 18, } print(query); @@ -25,24 +25,24 @@ route /poc { """Post and put hello API""" query { @string(min_len=3, max_len=30) - content: str + content: str, """age""" - age: int = 18 + age: int = 18, @in(["ios", "android"]) - platform: str = "ios" + platform: str = "ios", } @json body { """test flag""" - test: bool = true + test: bool = true, } ai fn ask(question) { - return prompt content; + return prompt question; } - let answer = ask(content); + let answer = ask(query.content); return "AI answer: " + answer; } } \ No newline at end of file diff --git a/examples/routes/repo.ai b/examples/routes/repo.ai index 3e7cf29..d7a487a 100644 --- a/examples/routes/repo.ai +++ b/examples/routes/repo.ai @@ -20,8 +20,11 @@ post /repo { return "create repo: " + name; } -put /repo/ { +put /repo/:id { """Update a repository API""" + path { + id: str + } body { """The repository name""" @string(min_len=3, max_len=30)