use web_ui::{WebUI, WebUIConfig, UIResponse};
use std::sync::atomic::{AtomicU32, Ordering};
use std::sync::Arc;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = WebUIConfig::default()
.with_port(3030) .with_title("Your Web UI Component".to_string()) .with_static_dir("./template/static".to_string());
let web_ui = WebUI::new(config);
let counter = Arc::new(AtomicU32::new(0));
web_ui.bind_click("your-button-id", || {
println!("Button was clicked!");
}).await;
let counter_clone = counter.clone();
web_ui.bind_event("your-button-id", "click", move |event| {
let count = counter_clone.fetch_add(1, Ordering::SeqCst) + 1;
println!("Event received: {:?}", event);
Ok(UIResponse {
success: true,
message: Some(format!("Action completed successfully! Count: {}", count)),
data: Some(serde_json::json!({
"count": count,
})),
request_id: event.request_id,
})
}).await;
web_ui.bind_event("your-input-id", "change", |event| {
println!("Input changed: {:?}", event.data);
let input_value = event.data.get("value")
.and_then(|v| v.as_str())
.unwrap_or("");
Ok(UIResponse {
success: true,
message: Some(format!("Input received: {}", input_value)),
data: Some(serde_json::json!({ "processed_input": input_value.to_uppercase() })),
request_id: event.request_id,
})
}).await;
web_ui.bind_event("your-form-id", "submit", |event| {
println!("Form submitted: {:?}", event.data);
let form_data = event.data.get("formData")
.and_then(|v| v.as_object());
let name = form_data
.and_then(|fd| fd.get("name"))
.and_then(|v| v.as_str())
.unwrap_or("Unknown");
let email = form_data
.and_then(|fd| fd.get("email"))
.and_then(|v| v.as_str())
.unwrap_or("No email provided");
Ok(UIResponse {
success: true,
message: Some(format!("Thank you, {}! Form submitted successfully.", name)),
data: Some(serde_json::json!({
"user_name": name,
"user_email": email,
})),
request_id: event.request_id,
})
}).await;
web_ui.bind_event("custom-action", "custom", |event| {
println!("Custom event received: {:?}", event);
let data = event.data.get("required_field");
if data.is_none() {
return Ok(UIResponse {
success: false,
message: Some("Required field is missing".to_string()),
data: None,
request_id: event.request_id,
});
}
Ok(UIResponse {
success: true,
message: Some("Custom action completed".to_string()),
data: Some(serde_json::json!({ "result": "success" })),
request_id: event.request_id,
})
}).await;
println!("Starting web UI server on http://localhost:3030");
web_ui.run().await?;
Ok(())
}
fn validate_email(email: &str) -> bool {
email.contains('@') && email.contains('.')
}
fn process_user_data(name: &str, email: &str) -> Result<String, String> {
if name.is_empty() {
return Err("Name cannot be empty".to_string());
}
if !validate_email(email) {
return Err("Invalid email format".to_string());
}
Ok(format!("User {} with email {} processed successfully", name, email))
}
fn create_success_response(message: &str, data: serde_json::Value, request_id: Option<u32>) -> UIResponse {
UIResponse {
success: true,
message: Some(message.to_string()),
data: Some(data),
request_id,
}
}
fn create_error_response(error: &str, request_id: Option<u32>) -> UIResponse {
UIResponse {
success: false,
message: Some(error.to_string()),
data: None,
request_id,
}
}