use thag_styling::{ColorInitStrategy, Styleable, StyledPrint, TermAttributes, Verbosity};
fn main() {
TermAttributes::get_or_init_with_strategy(&ColorInitStrategy::Match);
println!("=== Styling System Migration Guide ===\n");
println!("1. Basic embedding:");
println!(" OLD: sprtln_with_embeds!(Role::Warning, \"Warning {{}} warning\", &[embed]);");
println!(" NEW: format!(\"Warning {{}} warning\", \"error\".error()).warning().println();");
println!();
println!(" Old approach would have required:");
println!(" let embed = \"error\".embed_with(Role::Error);");
println!(
" thag_styling::sprtln_with_embeds!(Role::Warning, \"Warning {{}} warning\", &[embed]);"
);
println!();
println!(" New approach:");
format!("Warning {} warning", "error".error())
.warning()
.println();
println!();
println!("2. Multiple embeds:");
println!(
" OLD: sprtln_with_embeds!(Role::Info, \"Status: {{}} and {{}}\", &[embed1, embed2]);"
);
println!(" NEW: format!(\"Status: {{}} and {{}}\", \"success\".success(), \"warning\".warning()).info().println();");
println!();
println!(" Old approach would have required:");
println!(" let embed1 = \"success\".embed_with(Role::Success);");
println!(" let embed2 = \"warning\".embed_with(Role::Warning);");
println!(" thag_styling::sprtln_with_embeds!(Role::Info, \"Status: {{}} and {{}}\", &[embed1, embed2]);");
println!();
println!(" New approach:");
format!(
"Status: {} and {}",
"success".success(),
"warning".warning()
)
.info()
.println();
println!();
println!("3. Verbosity-gated printing:");
println!(" OLD: svprtln_with_embeds!(Role::Debug, V::Debug, \"Debug: {{}}\", &[embed]);");
println!(" NEW: format!(\"Debug: {{}}\", \"value\".code()).debug().vprintln(V::Debug);");
println!();
println!(" Old approach would have required:");
println!(" let debug_embed = \"value\".embed_with(Role::Code);");
println!(" thag_styling::svprtln_with_embeds!(Role::Debug, Verbosity::Debug, \"Debug: {{}}\", &[debug_embed]);");
println!();
println!(" New approach:");
format!("Debug: {}", "value".code())
.debug()
.vprintln(Verbosity::Debug);
println!();
println!("4. Complex multi-level nesting:");
println!(" OLD: Required manual embed array construction");
println!(" NEW: Natural nested format! calls");
println!();
println!(" New approach (unlimited nesting):");
let deep_result = format!(
"Level1: Success [{}] [{}] Level1: Success",
format!(
"Level2a: Warning [{}] [{}] Level2a: Warning]",
format!(
"Level3a: Error italic [{}] Level3a: Error italic",
"Level 4: Code bold".code().bold()
)
.error()
.italic(),
"Level3b: Plain Error".error()
)
.warning()
.bold(),
"Level 2b: Normal".normal()
)
.success();
deep_result.println();
println!();
println!(" New approach stepwise:");
let level4 = "Level 4: Code bold".code().bold();
let level3a = format!("Level3a: Error italic [{level4}] Level3a: Error italic")
.error()
.italic();
let level3b = "Level3b: Plain Error".error();
let level2a = format!("Level2a: Warning [{level3a}] [{level3b}] Level2a: Warning]",)
.warning()
.bold();
let level2b = "Level 2b: Normal".normal();
format!("Level1: Success [{level2a}] [{level2b}] Level1: Success")
.success()
.println();
println!();
println!("5. Text attribute handling:");
println!(" The new system prevents attribute bleeding between levels");
println!();
println!(" StyledString approach (no bleeding):");
let result = format!(
"Normal {} {} normal",
"bold text".normal().bold(),
"italic text".normal().italic()
)
.info();
result.println();
println!();
println!("6. Method chaining:");
println!(" NEW: Fluent interface with chaining");
println!();
"Simple error".error().bold().println();
"Warning with style"
.warning()
.italic()
.underline()
.println();
println!();
println!("7. Migration helpers (deprecated but available temporarily):");
println!(" styled_println and styled_vprintln functions");
println!();
println!(" Example migration helpers (now removed):");
println!(" styled_println(Role::Success, &format!(\"Migrated: {{}}\", \"success\".code()));");
println!(
" styled_vprintln(Role::Debug, V::Debug, &format!(\"Debug: {{}}\", \"info\".info()));"
);
println!();
println!(" Direct modern equivalent:");
format!("Migrated: {}", "success".code())
.success()
.println();
format!("Debug: {}", "info".info())
.debug()
.vprintln(Verbosity::Debug);
println!();
println!("8. Performance benefits:");
println!(" - No macro expansion overhead");
println!(" - No temporary embed array allocations");
println!(" - Direct string formatting");
println!(" - Fewer function calls");
println!();
println!("9. Code clarity:");
println!();
println!(" OLD (verbose, manual):");
println!(" let embed1 = \"error\".embed_with(Role::Error);");
println!(" let embed2 = \"warning\".embed_with(Role::Warning);");
println!(" sprtln_with_embeds!(Role::Info, \"Status: {{}} and {{}}\", &[embed1, embed2]);");
println!();
println!(" NEW (concise, natural):");
println!(" format!(\"Status: {{}} and {{}}\", \"error\".error(), \"warning\".warning()).info().println();");
println!();
println!("10. Robust error handling:");
println!(" The new system handles edge cases better:");
println!();
"".error().println();
format!("Text {} text", "".warning()).info().println();
format!("Unicode: {} {}", "🚀".success(), "emoji".code())
.normal()
.println();
println!();
println!("=== Migration Summary ===");
println!("✅ Replace sprtln_with_embeds! with format!().role_method().println()");
println!("✅ Replace svprtln_with_embeds! with format!().role_method().vprintln(verbosity)");
println!("✅ Replace format_with_embeds with direct format! calls");
println!("✅ Replace Embedded struct with direct StyledString usage");
println!("✅ Use semantic role methods (.error(), .warning(), etc.)");
println!("✅ Enjoy perfect attribute reset handling automatically");
println!();
println!("📝 NOTE: Keep using Styled<T> for general text effects:");
println!(" \"text\".style().bold().italic() - STILL RECOMMENDED");
println!(" This migration is specifically for embedding/nesting scenarios");
println!();
println!("🎯 The new approach is more:");
println!(" • Natural (standard Rust patterns)");
println!(" • Powerful (unlimited nesting)");
println!(" • Performant (no macro overhead)");
println!(" • Reliable (perfect attribute handling)");
println!(" • Maintainable (cleaner code structure)");
}