use recoco::builder::FlowBuilder;
use recoco::execution::evaluator::evaluate_transient_flow;
use recoco::prelude::*;
use serde_json::json;
use tokio::fs::File;
use tokio::io::AsyncBufReadExt;
use tokio::io::BufReader;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
recoco::lib_context::init_lib_context(Some(recoco::settings::Settings::default())).await?;
println!("Building file processing flow...");
let mut builder = FlowBuilder::new("file_processor").await?;
let line_input = builder.add_direct_input(
"line".to_string(),
schema::make_output_type(schema::BasicValueType::Str),
)?;
let tokens = builder
.transform(
"SplitBySeparators".to_string(),
json!({
"separators_regex": [" ", "\t", "\\.", ","],
"keep_separator": null,
"include_empty": false,
"trim": true
})
.as_object()
.unwrap()
.clone(),
vec![(line_input, Some("text".to_string()))],
None,
"tokenizer".to_string(),
)
.await?;
builder.set_direct_output(tokens)?;
let flow = builder.build_transient_flow().await?;
let file_path = "crates/recoco/Cargo.toml";
println!("Processing file: {}", file_path);
let file = File::open(file_path).await?;
let mut reader = BufReader::new(file);
let mut line = String::new();
let mut line_num = 0;
while reader.read_line(&mut line).await? > 0 {
line_num += 1;
let trimmed = line.trim();
if trimmed.is_empty() || trimmed.starts_with('#') {
line.clear();
continue;
}
let input_value = value::Value::Basic(value::BasicValue::Str(line.clone().into()));
let result = evaluate_transient_flow(&flow.0, &vec![input_value]).await?;
if let value::Value::KTable(chunks) = result {
let count = chunks.len();
if count > 0 {
println!("Line {}: found {} tokens", line_num, count);
for (k, v) in chunks.iter().take(3) {
println!(" - {:?} -> {:?}", k, v);
}
}
}
line.clear();
}
Ok(())
}