Skip to content

Commit aac486d

Browse files
Merge pull request #141 from code0-tech/129-new-flow-identification-system
Rework of Flow Identification
2 parents 0c12bcf + 2586e46 commit aac486d

4 files changed

Lines changed: 86 additions & 47 deletions

File tree

Cargo.lock

Lines changed: 43 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ version = "0.0.0"
77
edition = "2024"
88

99
[workspace.dependencies]
10-
code0-flow = { version = "0.0.22" }
11-
tucana = { version = "0.0.50", features = ["aquila"] }
10+
code0-flow = { version = "0.0.24" }
11+
tucana = { version = "0.0.52", features = ["aquila"] }
1212
serde_json = { version = "1.0.138" }
1313
log = "0.4.27"
1414
env_logger = "0.11.8"

adapter/rest/src/main.rs

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use base::{
2-
extract_flow_setting_field,
32
runner::{ServerContext, ServerRunner},
43
store::FlowIdentifyResult,
54
traits::{IdentifiableFlow, LoadConfig, Server as ServerTrait},
@@ -36,12 +35,26 @@ struct RequestRoute {
3635

3736
impl IdentifiableFlow for RequestRoute {
3837
fn identify(&self, flow: &ValidationFlow) -> bool {
39-
let url = extract_flow_setting_field(&flow.settings, "HTTP_URL", "url");
40-
let regex_str = match url.as_deref() {
41-
Some(s) => s,
42-
None => return false,
38+
let regex_str = flow
39+
.settings
40+
.iter()
41+
.find(|s| s.flow_setting_id == "HTTP_URL")
42+
.and_then(|s| s.value.as_ref())
43+
.and_then(|v| v.kind.as_ref())
44+
.and_then(|k| match k {
45+
Kind::StringValue(s) => Some(s.as_str()),
46+
_ => None,
47+
});
48+
49+
let Some(regex_str) = regex_str else {
50+
return false;
4351
};
4452

53+
print!(
54+
"Comparing regex {} with literal route: {}",
55+
regex_str, self.url
56+
);
57+
4558
match regex::Regex::new(regex_str) {
4659
Ok(regex) => regex.is_match(&self.url),
4760
Err(err) => {
@@ -71,19 +84,32 @@ impl ServerTrait<HttpServerConfig> for HttpServer {
7184
move |request: HttpRequest| {
7285
let store = Arc::clone(&store);
7386
async move {
74-
let pattern = format!("*.*.REST.{}.{:?}", request.host, request.method);
75-
let route = RequestRoute {
76-
url: request.path.clone(),
77-
};
78-
79-
match store.get_possible_flow_match(pattern, route).await {
80-
FlowIdentifyResult::Single(flow) => {
81-
execute_flow(flow, request, store).await
87+
//Get slug => host/slug/real_path
88+
89+
let splits: Vec<_> = request.path.split("/").collect();
90+
let first = splits.first();
91+
92+
if let Some(slug) = first {
93+
let pattern = format!("REST.{}.*", slug);
94+
let route = RequestRoute {
95+
url: request.path.clone(),
96+
};
97+
98+
match store.get_possible_flow_match(pattern, route).await {
99+
FlowIdentifyResult::Single(flow) => {
100+
print!("Found flow: {}", flow.flow_id);
101+
execute_flow(flow, request, store).await
102+
}
103+
_ => Some(HttpResponse::internal_server_error(
104+
format!("No flow found for path: {}", request.path),
105+
HashMap::new(),
106+
)),
82107
}
83-
_ => Some(HttpResponse::internal_server_error(
108+
} else {
109+
Some(HttpResponse::internal_server_error(
84110
format!("No flow found for path: {}", request.path),
85111
HashMap::new(),
86-
)),
112+
))
87113
}
88114
}
89115
}

crates/base/src/lib.rs

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,4 @@
1-
use tucana::shared::{FlowSetting, value::Kind};
2-
31
pub mod config;
42
pub mod runner;
53
pub mod store;
64
pub mod traits;
7-
8-
pub fn extract_flow_setting_field(
9-
settings: &Vec<FlowSetting>,
10-
def_key: &str,
11-
field_name: &str,
12-
) -> Option<String> {
13-
settings.iter().find_map(|setting| {
14-
if setting.flow_setting_id != def_key {
15-
return None;
16-
}
17-
18-
let obj = setting.object.as_ref()?;
19-
obj.fields.iter().find_map(|(k, v)| {
20-
if k == field_name
21-
&& let Some(Kind::StringValue(s)) = &v.kind
22-
{
23-
return Some(s.clone());
24-
}
25-
None
26-
})
27-
})
28-
}

0 commit comments

Comments
 (0)