basic_usage/
basic_usage.rs

1// examples/basic_usage.rs
2//! Basic usage example for v-storage library
3//! 
4//! This example demonstrates:
5//! - Creating memory storage
6//! - Basic operations: put, get, remove, count
7//! - Working with different data types (strings, binary data)
8//! - Using different StorageId types
9
10use v_storage::*;
11
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13    println!("=== Basic v-storage Usage Example ===\n");
14
15    // Create memory storage using Builder pattern
16    let storage = VStorage::builder()
17        .memory()
18        .build()?;
19    let mut storage = VStorage::new(storage);
20
21    println!("āœ… Storage created successfully");
22
23    // === Basic data operations ===
24    
25    // 1. Storing data
26    println!("\nšŸ“ Storing data:");
27    
28    let _ = storage.put_value(StorageId::Individuals, "user:1", r#"{
29        "@": "user:1", 
30        "rdf:type": [{"type": "Uri", "data": "foaf:Person"}],
31        "rdfs:label": [{"type": "String", "data": "Ivan Petrov"}],
32        "foaf:name": [{"type": "String", "data": "Ivan"}],
33        "foaf:familyName": [{"type": "String", "data": "Petrov"}], 
34        "foaf:age": [{"type": "Integer", "data": 30}],
35        "foaf:mbox": [{"type": "String", "data": "ivan.petrov@example.com"}],
36        "veda:created": [{"type": "Datetime", "data": "2024-01-15T10:30:00Z"}]
37    }"#);
38    let _ = storage.put_value(StorageId::Tickets, "ticket:123", r#"{
39        "@": "ticket:123",
40        "rdf:type": [{"type": "Uri", "data": "veda:Ticket"}],
41        "rdfs:label": [{"type": "String", "data": "Support Request"}],
42        "dcterms:title": [{"type": "String", "data": "Email server issue"}],
43        "veda:status": [{"type": "String", "data": "pending"}],
44        "veda:priority": [{"type": "String", "data": "medium"}],
45        "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T09:15:00Z"}]
46    }"#);
47    let _ = storage.put_value(StorageId::Az, "permission:read", r#"{
48        "@": "permission:read",
49        "rdf:type": [{"type": "Uri", "data": "veda:Permission"}],
50        "rdfs:label": [{"type": "String", "data": "Read Access"}],
51        "veda:permissionSubject": [{"type": "Uri", "data": "user:1"}],
52        "veda:permissionObject": [{"type": "Uri", "data": "resource:documents"}],
53        "veda:canRead": [{"type": "Boolean", "data": true}],
54        "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T08:00:00Z"}]
55    }"#);
56
57    println!("   • Stored user: user:1");
58    println!("   • Stored ticket: ticket:123");
59    println!("   • Stored permission: permission:read");
60
61    // 2. Reading data
62    println!("\nšŸ“– Reading data:");
63    
64    if let StorageResult::Ok(user_data) = storage.get_value(StorageId::Individuals, "user:1") {
65        println!("   • User Individual ({}): Ivan Petrov", user_data.len());
66    }
67    
68    if let StorageResult::Ok(ticket_data) = storage.get_value(StorageId::Tickets, "ticket:123") {
69        println!("   • Ticket Individual ({}): Support Request", ticket_data.len());
70    }
71    
72    if let StorageResult::Ok(permission_data) = storage.get_value(StorageId::Az, "permission:read") {
73        println!("   • Permission Individual ({}): Read Access", permission_data.len());
74    }
75
76    // 3. Working with binary data
77    println!("\nšŸ”¢ Working with binary data:");
78    
79    let binary_data = vec![0xFF, 0xFE, 0xFD, 0x00, 0x01, 0x02];
80    let _ = storage.put_raw_value(StorageId::Individuals, "binary:data", binary_data.clone());
81    
82    if let StorageResult::Ok(retrieved_binary) = storage.get_raw_value(StorageId::Individuals, "binary:data") {
83        println!("   • Stored {} bytes of binary data", retrieved_binary.len());
84        println!("   • Data matches: {}", retrieved_binary == binary_data);
85    }
86
87    // 4. Counting records
88    println!("\nšŸ“Š Statistics:");
89    
90    if let StorageResult::Ok(individuals_count) = storage.count(StorageId::Individuals) {
91        println!("   • Individuals count: {}", individuals_count);
92    }
93    
94    if let StorageResult::Ok(tickets_count) = storage.count(StorageId::Tickets) {
95        println!("   • Tickets count: {}", tickets_count);
96    }
97    
98    if let StorageResult::Ok(az_count) = storage.count(StorageId::Az) {
99        println!("   • Permissions count: {}", az_count);
100    }
101
102    // 5. Removing data
103    println!("\nšŸ—‘ļø  Removing data:");
104    
105    let _ = storage.remove_value(StorageId::Tickets, "ticket:123");
106    println!("   • Ticket ticket:123 removed");
107    
108    // Check that data is actually removed
109    match storage.get_value(StorageId::Tickets, "ticket:123") {
110        StorageResult::NotFound => println!("   • Confirmed: ticket not found"),
111        _ => println!("   • Error: ticket still exists"),
112    }
113
114    // 6. Error handling
115    println!("\nāš ļø  Error handling:");
116    
117    match storage.get_value(StorageId::Individuals, "nonexistent") {
118        StorageResult::NotFound => println!("   • Correctly handled missing key case"),
119        StorageResult::Ok(_) => println!("   • Unexpected: found data"),
120        StorageResult::Error(e) => println!("   • Error: {}", e),
121        _ => println!("   • Other result"),
122    }
123
124    // === Backward compatibility demonstration ===
125    println!("\nšŸ”„ Backward compatibility:");
126    
127    #[allow(deprecated)]
128    {
129        // Using old methods
130        let success = storage.put_kv(StorageId::Individuals, "old:key", "old:value");
131        println!("   • Old put_kv: {}", if success { "success" } else { "error" });
132        
133        if let Some(value) = storage.get_v(StorageId::Individuals, "old:key") {
134            println!("   • Old get_v: {}", value);
135        }
136    }
137
138    println!("\n✨ Example completed successfully!");
139    Ok(())
140}