use allframe_core::router::{graphiql_html, GraphiQLConfig, GraphiQLTheme, Router};
fn main() {
println!("🚀 AllFrame GraphQL Documentation Example");
println!("==========================================\n");
let router = Router::new();
println!("✅ Router created\n");
println!("🎨 Configuring GraphiQL playground...");
let graphiql_config = GraphiQLConfig::new()
.endpoint_url("/graphql")
.subscription_url("ws://localhost:3000/graphql")
.theme(GraphiQLTheme::Dark)
.enable_explorer(true)
.enable_history(true)
.add_header("Authorization", "Bearer your-token-here")
.add_header("X-API-Version", "v1")
.cdn_url("https://unpkg.com/graphiql@3.0.0/graphiql.min.css")
.custom_css(
r#"
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
}
.graphiql-container {
--color-primary: 60, 76, 231;
}
"#,
);
println!(" • Endpoint: /graphql");
println!(" • Subscriptions: ws://localhost:3000/graphql");
println!(" • Theme: Dark mode");
println!(" • Explorer: Enabled");
println!(" • History: Enabled");
println!(" • Custom headers: 2 configured");
println!(" • Custom CSS: Applied\n");
println!("🎭 Generating GraphiQL HTML documentation...");
let graphiql_html = graphiql_html(&graphiql_config, "AllFrame GraphQL API");
println!(
"✅ GraphiQL HTML generated ({} bytes)\n",
graphiql_html.len()
);
println!("📦 Generated documentation includes:");
println!(" ✅ Interactive GraphQL playground");
println!(" ✅ Schema explorer sidebar");
println!(" ✅ Query editor with syntax highlighting");
println!(" ✅ Variables editor");
println!(" ✅ Headers configuration");
println!(" ✅ Query history persistence");
println!(" ✅ Subscription support via WebSocket");
println!(" ✅ Dark theme by default");
println!();
println!("🚀 Next Steps:");
println!(" 1. Integrate with your web framework (Axum, Actix, etc.)");
println!(" 2. Serve the HTML at /graphql/playground");
println!(" 3. Implement GraphQL endpoint at /graphql");
println!(" 4. Optionally: Add WebSocket support for subscriptions");
println!();
println!("💡 Example Integration (Axum with async-graphql):");
println!(
r#"
use axum::{{routing::{{get, post}}, Router, response::Html}};
use async_graphql::{{Schema, EmptyMutation, EmptySubscription}};
use async_graphql_axum::GraphQL;
// Define your GraphQL schema
struct Query;
#[Object]
impl Query {{
async fn hello(&self) -> &str {{
"Hello, GraphQL!"
}}
async fn users(&self) -> Vec<User> {{
vec![
User {{ id: 1, name: "Alice".to_string() }},
User {{ id: 2, name: "Bob".to_string() }},
]
}}
}}
#[derive(SimpleObject)]
struct User {{
id: i32,
name: String,
}}
#[tokio::main]
async fn main() {{
// Build GraphQL schema
let schema = Schema::new(Query, EmptyMutation, EmptySubscription);
let app = Router::new()
// GraphQL endpoint
.route("/graphql", post(GraphQL::new(schema.clone())))
// GraphiQL playground
.route("/graphql/playground", get(|| async {{
Html(graphiql_html)
}}));
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000")
.await
.unwrap();
println!("📚 GraphiQL Playground: http://localhost:3000/graphql/playground");
println!("🔌 GraphQL Endpoint: http://localhost:3000/graphql");
axum::serve(listener, app).await.unwrap();
}}
"#
);
println!("\n💡 Example GraphQL Queries to Try:");
println!(
r#"
# Simple query
query {{
hello
}}
# Query with fields
query {{
users {{
id
name
}}
}}
# Query with variables
query GetUser($id: Int!) {{
user(id: $id) {{
id
name
email
}}
}}
# Variables (in Variables panel):
{{
"id": 1
}}
# Mutation
mutation {{
createUser(name: "Charlie", email: "charlie@example.com") {{
id
name
email
}}
}}
# Subscription (requires WebSocket)
subscription {{
userCreated {{
id
name
}}
}}
"#
);
println!("\n📊 GraphiQL vs GraphQL Playground:");
println!(" GraphiQL 3.0 | GraphQL Playground");
println!(" ─────────────────────────────────────");
println!(" Modern React UI | Older UI");
println!(" Active development| Deprecated");
println!(" Built-in explorer | Plugin required");
println!(" ~100KB bundle | ~200KB bundle");
println!(" Dark mode native | Theme switching");
println!();
println!("⚙️ Available Configuration Options:");
println!(" • endpoint_url: GraphQL endpoint URL");
println!(" • subscription_url: WebSocket URL for subscriptions");
println!(" • theme: Light or Dark");
println!(" • enable_explorer: Toggle schema explorer sidebar");
println!(" • enable_history: Toggle query history persistence");
println!(" • add_header: Add custom HTTP headers");
println!(" • cdn_url: Pin GraphiQL version");
println!(" • custom_css: Inject custom styling");
println!();
println!("✨ Example complete!");
println!("\n🎯 Key Takeaways:");
println!(" 1. GraphiQL provides beautiful, interactive GraphQL documentation");
println!(" 2. Full subscription support via WebSocket");
println!(" 3. Schema explorer for easy API discovery");
println!(" 4. Query history for development productivity");
println!(" 5. Customizable theming and styling");
println!(" 6. Production-ready with CDN version pinning");
}