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
use crate::{rust::*, tree::Node};
use anyhow::Result;
use bytes::Bytes;
use semver::{Version, VersionReq};
use serde::{Deserialize, Serialize};
use std::collections::BTreeSet;
use thiserror::Error;

pub const API_VERSION: u16 = 1;

pub fn api_version() -> Version {
    env!("CARGO_PKG_VERSION")
        .parse()
        .expect("can parse package version")
}

pub fn version_required() -> VersionReq {
    env!("CARGO_PKG_VERSION")
        .parse()
        .expect("can parse version required")
}

#[derive(Error, Debug, Serialize, Deserialize)]
pub enum VersionWriteError {
    #[error("error writing version")]
    Exists,
}

#[tarpc::service]
pub trait Storage {
    /// Ping message, should respond with the same message.
    async fn ping(message: String) -> String;

    /// Get version of storage server.
    async fn version() -> Version;

    /// Create a crate, if it does not exist.
    async fn crate_write(name: CrateInfo);

    /// Get list of crates
    async fn crate_list() -> BTreeSet<CrateName>;

    /// Get full crate info
    async fn crate_info(krate: CrateName) -> Option<CrateInfo>;

    /// Get an object
    async fn object_get(hash: Checksum) -> Option<Bytes>;

    /// Check if an object exists
    async fn object_exists(hash: Checksum) -> bool;

    /// Write an object
    async fn object_write(bytes: Bytes) -> Checksum;

    /// Run garbage collection over objects
    async fn object_gc();

    /// List all crate-versions which are missing sources
    async fn sources_missing(limit: usize) -> BTreeSet<CrateVersion>;

    async fn crate_tree_write(krate: CrateVersion, root: Node);

    /*
    async fn crate_metadata(krate: CrateName) -> Option<CrateMetadata>;

    async fn version_info(krate: CrateName) -> Option<VersionInfo>;
    */
}