//! Example of parsing and working with DID documents use atproto_plc::{Did, DidBuilder, PlcState, ServiceEndpoint, SigningKey}; fn main() -> Result<(), Box> { println!("DID Document Parsing Example\n"); println!("{}", "=".repeat(60)); // Create a DID and document println!("\n1. Creating a new DID..."); let rotation_key = SigningKey::generate_p256(); let signing_key = SigningKey::generate_k256(); let (did, operation, _keys) = DidBuilder::new() .add_rotation_key(rotation_key) .add_verification_method("atproto".into(), signing_key) .add_also_known_as("at://alice.bsky.social".into()) .add_service( "atproto_pds".into(), ServiceEndpoint::new( "AtprotoPersonalDataServer".into(), "https://pds.example.com".into(), ), ) .build()?; println!(" Created DID: {}", did); // Extract state from operation println!("\n2. Extracting PLC state from operation..."); let state = if let Some(rotation_keys) = operation.rotation_keys() { let mut state = PlcState::new(); state.rotation_keys = rotation_keys.to_vec(); // In a real scenario, we'd extract all fields from the operation state } else { PlcState::new() }; println!(" Rotation keys: {}", state.rotation_keys.len()); // Convert to W3C DID Document println!("\n3. Converting to W3C DID Document..."); let doc = state.to_did_document(&did); println!(" Document ID: {}", doc.id); println!(" Verification methods: {}", doc.verification_method.len()); println!(" Services: {}", doc.service.len()); println!(" Also known as: {}", doc.also_known_as.len()); // Serialize to JSON println!("\n4. Serializing to JSON..."); let json = serde_json::to_string_pretty(&doc)?; println!("\nDID Document (JSON):\n{}", json); // Parse back from JSON println!("\n5. Parsing back from JSON..."); let parsed_doc: atproto_plc::DidDocument = serde_json::from_str(&json)?; println!(" ✅ Successfully parsed!"); println!(" Parsed ID: {}", parsed_doc.id); // Validate println!("\n6. Validating document..."); match parsed_doc.validate() { Ok(_) => println!(" ✅ Document is valid!"), Err(e) => println!(" ❌ Validation error: {}", e), } println!("\n{}", "=".repeat(60)); println!("\nExample complete!"); Ok(()) }