diff --git a/Cargo.lock b/Cargo.lock index 0ab3727..f3396ee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -104,6 +104,43 @@ dependencies = [ "url", ] +[[package]] +name = "async-nats" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df5af9ebfb0a14481d3eaf6101e6391261e4f30d25b26a7635ade8a39482ded0" +dependencies = [ + "base64", + "bytes", + "futures-util", + "memchr", + "nkeys", + "nuid", + "once_cell", + "pin-project", + "portable-atomic", + "rand", + "regex", + "ring", + "rustls-native-certs", + "rustls-pki-types", + "rustls-webpki 0.102.8", + "serde", + "serde_json", + "serde_nanos", + "serde_repr", + "thiserror", + "time", + "tokio", + "tokio-rustls", + "tokio-stream", + "tokio-util", + "tokio-websockets", + "tracing", + "tryhard", + "url", +] + [[package]] name = "async-trait" version = "0.1.89" @@ -177,7 +214,7 @@ name = "base" version = "0.0.0" dependencies = [ "anyhow", - "async-nats", + "async-nats 0.45.0", "async-trait", "code0-flow", "env_logger", @@ -259,11 +296,11 @@ dependencies = [ [[package]] name = "code0-flow" -version = "0.0.22" +version = "0.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d96a21ced515a491d2991c203b90d71d77f00b1818060c2f4a8038737d343ed" +checksum = "f4ebec2afaa7c154191715c695390a7552693d0664efff399633150972f1accb" dependencies = [ - "async-nats", + "async-nats 0.46.0", "async-trait", "dotenv", "futures-core", @@ -2042,9 +2079,9 @@ dependencies = [ [[package]] name = "tucana" -version = "0.0.50" +version = "0.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "895831395ed4175f80d471ae0d7480050d68e43b48482bf899919fbbd5a0aa92" +checksum = "63e1cec14d8140417b330fffd1fb07f52cbd69063a4bd5688e63511b5bf8c8aa" dependencies = [ "pbjson", "pbjson-build", diff --git a/Cargo.toml b/Cargo.toml index a0242d2..6b24365 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,8 +7,8 @@ version = "0.0.0" edition = "2024" [workspace.dependencies] -code0-flow = { version = "0.0.22" } -tucana = { version = "0.0.50", features = ["aquila"] } +code0-flow = { version = "0.0.24" } +tucana = { version = "0.0.52", features = ["aquila"] } serde_json = { version = "1.0.138" } log = "0.4.27" env_logger = "0.11.8" diff --git a/adapter/rest/src/main.rs b/adapter/rest/src/main.rs index c2dfa00..060ec62 100644 --- a/adapter/rest/src/main.rs +++ b/adapter/rest/src/main.rs @@ -1,5 +1,4 @@ use base::{ - extract_flow_setting_field, runner::{ServerContext, ServerRunner}, store::FlowIdentifyResult, traits::{IdentifiableFlow, LoadConfig, Server as ServerTrait}, @@ -36,12 +35,26 @@ struct RequestRoute { impl IdentifiableFlow for RequestRoute { fn identify(&self, flow: &ValidationFlow) -> bool { - let url = extract_flow_setting_field(&flow.settings, "HTTP_URL", "url"); - let regex_str = match url.as_deref() { - Some(s) => s, - None => return false, + let regex_str = flow + .settings + .iter() + .find(|s| s.flow_setting_id == "HTTP_URL") + .and_then(|s| s.value.as_ref()) + .and_then(|v| v.kind.as_ref()) + .and_then(|k| match k { + Kind::StringValue(s) => Some(s.as_str()), + _ => None, + }); + + let Some(regex_str) = regex_str else { + return false; }; + print!( + "Comparing regex {} with literal route: {}", + regex_str, self.url + ); + match regex::Regex::new(regex_str) { Ok(regex) => regex.is_match(&self.url), Err(err) => { @@ -71,19 +84,32 @@ impl ServerTrait for HttpServer { move |request: HttpRequest| { let store = Arc::clone(&store); async move { - let pattern = format!("*.*.REST.{}.{:?}", request.host, request.method); - let route = RequestRoute { - url: request.path.clone(), - }; - - match store.get_possible_flow_match(pattern, route).await { - FlowIdentifyResult::Single(flow) => { - execute_flow(flow, request, store).await + //Get slug => host/slug/real_path + + let splits: Vec<_> = request.path.split("/").collect(); + let first = splits.first(); + + if let Some(slug) = first { + let pattern = format!("REST.{}.*", slug); + let route = RequestRoute { + url: request.path.clone(), + }; + + match store.get_possible_flow_match(pattern, route).await { + FlowIdentifyResult::Single(flow) => { + print!("Found flow: {}", flow.flow_id); + execute_flow(flow, request, store).await + } + _ => Some(HttpResponse::internal_server_error( + format!("No flow found for path: {}", request.path), + HashMap::new(), + )), } - _ => Some(HttpResponse::internal_server_error( + } else { + Some(HttpResponse::internal_server_error( format!("No flow found for path: {}", request.path), HashMap::new(), - )), + )) } } } diff --git a/crates/base/src/lib.rs b/crates/base/src/lib.rs index b85986a..3840a1c 100644 --- a/crates/base/src/lib.rs +++ b/crates/base/src/lib.rs @@ -1,28 +1,4 @@ -use tucana::shared::{FlowSetting, value::Kind}; - pub mod config; pub mod runner; pub mod store; pub mod traits; - -pub fn extract_flow_setting_field( - settings: &Vec, - def_key: &str, - field_name: &str, -) -> Option { - settings.iter().find_map(|setting| { - if setting.flow_setting_id != def_key { - return None; - } - - let obj = setting.object.as_ref()?; - obj.fields.iter().find_map(|(k, v)| { - if k == field_name - && let Some(Kind::StringValue(s)) = &v.kind - { - return Some(s.clone()); - } - None - }) - }) -}