1use alto_types::{Identity, Scheme};
4use commonware_cryptography::sha256::Digest;
5use commonware_utils::hex;
6use thiserror::Error;
7
8pub mod consensus;
9pub mod utils;
10
11const LATEST: &str = "latest";
12
13pub enum Query {
14 Latest,
15 Index(u64),
16 Digest(Digest),
17}
18
19impl Query {
20 pub fn serialize(&self) -> String {
21 match self {
22 Query::Latest => LATEST.to_string(),
23 Query::Index(index) => hex(&index.to_be_bytes()),
24 Query::Digest(digest) => hex(digest),
25 }
26 }
27}
28
29pub enum IndexQuery {
30 Latest,
31 Index(u64),
32}
33
34impl IndexQuery {
35 pub fn serialize(&self) -> String {
36 match self {
37 IndexQuery::Latest => LATEST.to_string(),
38 IndexQuery::Index(index) => hex(&index.to_be_bytes()),
39 }
40 }
41}
42
43#[derive(Error, Debug)]
44pub enum Error {
45 #[error("reqwest error: {0}")]
46 Reqwest(#[from] reqwest::Error),
47 #[error("tungstenite error: {0}")]
48 Tungstenite(#[from] tokio_tungstenite::tungstenite::Error),
49 #[error("failed: {0}")]
50 Failed(reqwest::StatusCode),
51 #[error("invalid data: {0}")]
52 InvalidData(#[from] commonware_codec::Error),
53 #[error("invalid signature")]
54 InvalidSignature,
55 #[error("unexpected response")]
56 UnexpectedResponse,
57}
58
59#[derive(Clone)]
60pub struct Client {
61 uri: String,
62 ws_uri: String,
63 certificate_verifier: Scheme,
64
65 client: reqwest::Client,
66}
67
68impl Client {
69 pub fn new(uri: &str, identity: Identity) -> Self {
70 let uri = uri.to_string();
71 let ws_uri = uri.replace("http", "ws");
72 let certificate_verifier = Scheme::certificate_verifier(identity);
73 Self {
74 uri,
75 ws_uri,
76 certificate_verifier,
77
78 client: reqwest::Client::new(),
79 }
80 }
81}