use std::collections::HashMap;
use std::env;
use std::process::ExitCode;
use a2ui_base::catalog::basic_functions::build_basic_functions;
use a2ui_base::catalog::function_api::FunctionImplementation;
use a2ui_base::protocol::server_to_client::A2uiMessage;
use a2ui_gallery::sample_loader::{self, Sample};
use a2ui_slint::host::SurfaceHost;
use a2ui_tui::catalogs::basic::build_basic_catalog;
use a2ui_tui::catalogs::minimal::build_minimal_catalog;
fn load_catalog_samples(catalog: &str) -> Vec<Sample> {
let subpath = format!("v1_0/catalogs/{catalog}/examples");
if let Ok(root) = env::var("A2UI_SPEC_DIR") {
sample_loader::load_samples_from_dir(&format!("{root}/{subpath}"))
} else {
sample_loader::load_samples(&subpath)
}
}
fn resolve_sample(arg: &str, samples: &[Sample]) -> Option<usize> {
if let Ok(n) = arg.parse::<usize>() {
if n >= 1 && n <= samples.len() {
return Some(n - 1);
}
return None;
}
let needle = arg.to_lowercase();
samples
.iter()
.position(|s| s.name.to_lowercase().contains(&needle))
}
fn main() -> ExitCode {
let mut samples = load_catalog_samples("minimal");
samples.extend(load_catalog_samples("basic"));
if samples.is_empty() {
eprintln!("No samples found.");
return ExitCode::from(1);
}
println!("A2UI Slint gallery — {} sample(s) available:", samples.len());
for (i, s) in samples.iter().enumerate() {
println!(" {:>2}. {} — {}", i + 1, s.name, s.description);
}
let args: Vec<String> = env::args().skip(1).collect();
let selected = match args.first().map(|s| s.as_str()) {
None => 0,
Some(arg) => match resolve_sample(arg, &samples) {
Some(idx) => idx,
None => {
eprintln!(
"No sample matches `{}`. Pass a 1-based index or a name \
substring (see the list printed above).",
arg
);
return ExitCode::from(1);
}
},
};
let sample = &samples[selected];
println!(
"\nShowing sample #{}: {} ({} messages)",
selected + 1,
sample.name,
sample.messages.len()
);
let catalogs = vec![build_basic_catalog(), build_minimal_catalog()];
let functions: HashMap<String, Box<dyn FunctionImplementation>> = build_basic_functions()
.into_iter()
.map(|f| {
let name = f.name().to_string();
(name, f)
})
.collect();
let host = match SurfaceHost::new(catalogs, functions) {
Ok(host) => host,
Err(err) => {
eprintln!("Failed to create Slint surface host: {err}");
return ExitCode::from(1);
}
};
let entries: Vec<(String, Vec<A2uiMessage>)> = samples
.iter()
.map(|s| (s.name.clone(), s.messages.clone()))
.collect();
host.set_samples(entries, selected);
if let Err(err) = host.run() {
eprintln!("Slint window error: {err}");
return ExitCode::from(1);
}
ExitCode::SUCCESS
}