File: schemars-examples.rs

package info (click to toggle)
rust-iddqd 0.3.17-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,088 kB
  • sloc: makefile: 2
file content (118 lines) | stat: -rw-r--r-- 3,032 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
//! Basic usage example for iddqd with schemars.

use iddqd::{
    BiHashItem, BiHashMap, IdHashItem, IdHashMap, TriHashItem, TriHashMap,
    bi_upcast, id_upcast, tri_upcast,
};
use schemars::{JsonSchema, schema_for};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

#[derive(Debug, Serialize, Deserialize, JsonSchema)]
struct User {
    name: String,
    email: String,
    age: u32,
}

impl IdHashItem for User {
    type Key<'a> = &'a str;

    fn key(&self) -> Self::Key<'_> {
        &self.name
    }

    id_upcast!();
}

impl BiHashItem for User {
    type K1<'a> = &'a str; // name
    type K2<'a> = &'a str; // email

    fn key1(&self) -> Self::K1<'_> {
        &self.name
    }

    fn key2(&self) -> Self::K2<'_> {
        &self.email
    }

    bi_upcast!();
}

impl TriHashItem for User {
    type K1<'a> = &'a str; // name
    type K2<'a> = &'a str; // email
    type K3<'a> = u32; // age

    fn key1(&self) -> Self::K1<'_> {
        &self.name
    }

    fn key2(&self) -> Self::K2<'_> {
        &self.email
    }

    fn key3(&self) -> Self::K3<'_> {
        self.age
    }

    tri_upcast!();
}

// Example container struct that uses iddqd maps with schema generation
#[derive(Serialize, Deserialize, JsonSchema)]
struct UserDatabase {
    /// Users indexed by name
    users_by_name: IdHashMap<User>,

    /// Users with bidirectional lookup by name and email
    users_bi: BiHashMap<User>,

    /// Users with three-way lookup by name, email, and age
    users_tri: TriHashMap<User>,

    /// Regular HashMap for comparison
    metadata: HashMap<String, String>,
}

fn main() {
    println!("* schemas:\n");

    // Generate schemas for individual map types.
    println!("*** schema for IdHashMap<User>:");
    let id_hash_schema = schema_for!(IdHashMap<User>);
    println!("{}\n", serde_json::to_string_pretty(&id_hash_schema).unwrap());

    println!("*** schema for BiHashMap<User>:");
    let bi_hash_schema = schema_for!(BiHashMap<User>);
    println!("{}\n", serde_json::to_string_pretty(&bi_hash_schema).unwrap());

    println!("*** schema for TriHashMap<User>:");
    let tri_hash_schema = schema_for!(TriHashMap<User>);
    println!("{}\n", serde_json::to_string_pretty(&tri_hash_schema).unwrap());

    // Generate a schema for the container struct.
    println!("schema for UserDatabase (container with multiple map types):");
    let database_schema = schema_for!(UserDatabase);
    println!("{}\n", serde_json::to_string_pretty(&database_schema).unwrap());

    let mut users = IdHashMap::new();
    users
        .insert_unique(User {
            name: "Alice".to_string(),
            email: "alice@example.com".to_string(),
            age: 30,
        })
        .unwrap();
    users
        .insert_unique(User {
            name: "Bob".to_string(),
            email: "bob@example.com".to_string(),
            age: 25,
        })
        .unwrap();

    println!("IdHashMap<User> serializes as:");
    println!("{}", serde_json::to_string_pretty(&users).unwrap());
}