storage_macro_chunk/
storage_macro_chunk.rs

1use colink::{decode_jwt_without_validation, CoLink};
2use rand::Rng;
3use std::env;
4
5const CHUNK_SIZE: usize = 1024 * 1024; // use 1MB chunks
6
7#[tokio::main]
8async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
9    let args = env::args().skip(1).collect::<Vec<_>>();
10    let addr = &args[0];
11    let jwt = &args[1];
12    let length = if args.len() > 2 {
13        args[2].parse::<usize>().unwrap()
14    } else {
15        5e6 as usize // default to 5 * 10^6 bytes
16    };
17    let user_id = decode_jwt_without_validation(jwt).unwrap().user_id;
18    println!("user_id: {}", user_id);
19    let cl = CoLink::new(addr, jwt);
20    let key_name = "storage_macro_demo:$chunk";
21    let payload = rand::thread_rng()
22        .sample_iter(&rand::distributions::Standard)
23        .take(length)
24        .collect::<Vec<u8>>();
25
26    // create
27    println!("Creating entry...");
28    let response = cl.create_entry(key_name, &payload.clone()).await?;
29    println!("created entry at key name: {}", response);
30
31    // read
32    println!("Reading entry...");
33    let data = cl.read_entry(key_name).await?;
34    assert_eq!(data, payload);
35    println!(
36        "Read payload of {}MB ({} bytes), verified to be same as bytes written",
37        payload.len() as f32 / CHUNK_SIZE as f32,
38        payload.len()
39    );
40
41    // update
42    println!("Updating entry...");
43    let new_payload = rand::thread_rng()
44        .sample_iter(&rand::distributions::Standard)
45        .take(length / 2)
46        .collect::<Vec<u8>>();
47    let response = cl.update_entry(key_name, &new_payload.clone()).await?;
48    println!("updated entry at key name: {}", response);
49
50    // read again to verify
51    println!("Reading entry again...");
52    let data = cl.read_entry(key_name).await?;
53    assert_eq!(data, new_payload);
54    println!(
55        "Read payload of {}MB ({} bytes), verified to be same as the updated payload bytes",
56        new_payload.len() as f32 / CHUNK_SIZE as f32,
57        new_payload.len()
58    );
59
60    // delete
61    println!("Deleting entry...");
62    cl.delete_entry(key_name).await?;
63    Ok(())
64}