Skip to main content

custom_types/
custom_types.rs

1use skytable::{
2    query,
3    query::SQParam,
4    response::{FromResponse, Response},
5    ClientResult, Config,
6};
7
8#[derive(Debug, PartialEq, Clone)]
9struct User {
10    username: String,
11    password: String,
12    followers: u64,
13    email: Option<String>,
14}
15
16impl User {
17    fn new(username: String, password: String, followers: u64, email: Option<String>) -> Self {
18        Self {
19            username,
20            password,
21            followers,
22            email,
23        }
24    }
25}
26
27impl SQParam for User {
28    fn append_param(&self, q: &mut Vec<u8>) -> usize {
29        self.username.append_param(q)
30            + self.password.append_param(q)
31            + self.followers.append_param(q)
32            + self.email.append_param(q)
33    }
34}
35
36impl FromResponse for User {
37    fn from_response(resp: Response) -> ClientResult<Self> {
38        let (username, password, followers, email) = FromResponse::from_response(resp)?;
39        Ok(Self::new(username, password, followers, email))
40    }
41}
42
43fn main() {
44    let mut db = Config::new_default("username", "password")
45        .connect()
46        .unwrap();
47
48    // set up schema
49    // create space
50    db.query_parse::<()>(&query!("create space myspace"))
51        .unwrap();
52    // create model
53    db.query_parse::<()>(&query!(
54        "create model myspace.mymodel(username: string, password: string, followers: uint64, null email: string)"
55    ))
56    .unwrap();
57
58    // insert data
59    let our_user = User::new("myuser".into(), "pass123".into(), 0, None);
60    db.query_parse::<()>(&query!(
61        "insert into myspace.mymodel(?, ?, ?, ?)",
62        our_user.clone()
63    ))
64    .unwrap();
65
66    // select data
67    let ret_user: User = db
68        .query_parse(&query!(
69            "select * from myspace.mymodel WHERE username = ?",
70            &our_user.username
71        ))
72        .unwrap();
73
74    assert_eq!(our_user, ret_user);
75}