#![allow(dead_code)]
use thag_demo_proc_macros::DeriveDocComment;
#[derive(Debug, DeriveDocComment)]
pub enum TaskStatus {
Pending,
InProgress,
Completed,
Failed,
Cancelled,
}
#[derive(Debug, DeriveDocComment)]
pub struct ServerConfig {
pub host: String,
pub port: u16,
pub timeout_ms: u64,
pub max_connections: u32,
pub enable_ssl: bool,
pub api_key: Option<String>,
}
#[derive(Debug, DeriveDocComment)]
pub struct Point3D(
f64,
f64,
f64,
);
#[derive(Debug, DeriveDocComment)]
pub struct InitComplete;
#[derive(Debug, DeriveDocComment)]
pub enum Protocol {
Http,
Https,
Ftp {
passive: bool,
custom_port: Option<u16>,
},
Smtp(
String,
u16,
),
}
fn main() {
println!("📚 Enhanced Documentation Extraction Demo");
println!("=========================================\n");
println!("1. Enum variant documentation:");
let status = TaskStatus::InProgress;
println!(" Current status: {:?}", status);
println!(" Documentation: \"{}\"", status.doc_comment());
println!("\n All available status docs:");
for (variant, doc) in TaskStatus::all_docs() {
println!(" {}: \"{}\"", variant, doc);
}
println!("\n2. Struct field documentation:");
let config = ServerConfig {
host: "api.example.com".to_string(),
port: 443,
timeout_ms: 5000,
max_connections: 100,
enable_ssl: true,
api_key: Some("secret_key_123".to_string()),
};
println!(" Config: {:?}", config);
println!("\n Field documentation lookup:");
let fields_to_check = ["host", "port", "timeout_ms", "enable_ssl", "nonexistent"];
for field in &fields_to_check {
match ServerConfig::field_doc(field) {
Some(doc) => println!(" {}: \"{}\"", field, doc),
None => println!(" {}: No documentation found", field),
}
}
println!("\n All field documentation:");
for (name, type_name, doc) in ServerConfig::all_field_docs() {
println!(" {} ({}): \"{}\"", name, type_name, doc);
}
println!("\n Struct-level documentation:");
println!(" \"{}\"", ServerConfig::struct_doc());
println!("\n3. Tuple struct documentation:");
let point = Point3D(1.5, 2.7, 3.9);
println!(" Point: {:?}", point);
println!(" Documentation: \"{}\"", Point3D::struct_doc());
println!("\n4. Unit struct documentation:");
let init = InitComplete;
println!(" Init marker: {:?}", init);
println!(" Documentation: \"{}\"", InitComplete::struct_doc());
println!("\n5. Complex enum documentation:");
let protocols = vec![
Protocol::Http,
Protocol::Https,
Protocol::Ftp {
passive: true,
custom_port: Some(2121),
},
Protocol::Smtp("mail.example.com".to_string(), 587),
];
for (i, protocol) in protocols.iter().enumerate() {
println!(" Protocol {}: {:?}", i + 1, protocol);
println!(" Documentation: \"{}\"", protocol.doc_comment());
}
println!("\n All protocol documentation:");
for (variant, doc) in Protocol::all_docs() {
println!(" {}: \"{}\"", variant, doc);
}
println!("\n6. Error handling demonstration:");
println!(" Looking up invalid field 'invalid_field':");
match ServerConfig::field_doc("invalid_field") {
Some(doc) => println!(" Found: \"{}\"", doc),
None => println!(" ✅ Correctly returned None for invalid field"),
}
println!("\n7. Runtime documentation access:");
println!(" This demonstrates how compile-time documentation");
println!(" becomes available at runtime for:");
println!(" - Help systems");
println!(" - Configuration validators");
println!(" - Auto-generated documentation");
println!(" - API introspection");
println!(" - Development tools");
println!("\n🎉 Enhanced documentation extraction demo completed successfully!");
println!("\nGenerated features demonstrated:");
println!(" - Enum variant documentation extraction");
println!(" - Struct field documentation with type information");
println!(" - Struct-level documentation access");
println!(" - Tuple and unit struct support");
println!(" - Complex enum variant handling");
println!(" - Runtime documentation lookup by name");
println!(" - Proper error handling for missing docs");
println!(" - Multi-line documentation support");
}