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 {
async fn ping(message: String) -> String;
async fn version() -> Version;
async fn crate_write(name: CrateInfo);
async fn crate_list() -> BTreeSet<CrateName>;
async fn crate_info(krate: CrateName) -> Option<CrateInfo>;
async fn object_get(hash: Checksum) -> Option<Bytes>;
async fn object_exists(hash: Checksum) -> bool;
async fn object_write(bytes: Bytes) -> Checksum;
async fn object_gc();
async fn sources_missing(limit: usize) -> BTreeSet<CrateVersion>;
async fn crate_tree_write(krate: CrateVersion, root: Node);
}