solana_commitment_config/
lib.rs1#![no_std]
3#![cfg_attr(docsrs, feature(doc_cfg))]
4use core::{fmt, str::FromStr};
5
6#[cfg_attr(
7 feature = "serde",
8 derive(serde_derive::Serialize, serde_derive::Deserialize),
9 serde(rename_all = "camelCase")
10)]
11#[derive(Default, Clone, Copy, Debug, PartialEq, Eq, Hash)]
12pub struct CommitmentConfig {
13 pub commitment: CommitmentLevel,
14}
15
16impl CommitmentConfig {
17 pub const fn finalized() -> Self {
18 Self {
19 commitment: CommitmentLevel::Finalized,
20 }
21 }
22
23 pub const fn confirmed() -> Self {
24 Self {
25 commitment: CommitmentLevel::Confirmed,
26 }
27 }
28
29 pub const fn processed() -> Self {
30 Self {
31 commitment: CommitmentLevel::Processed,
32 }
33 }
34
35 pub fn ok(self) -> Option<Self> {
36 if self == Self::default() {
37 None
38 } else {
39 Some(self)
40 }
41 }
42
43 pub fn is_finalized(&self) -> bool {
44 self.commitment == CommitmentLevel::Finalized
45 }
46
47 pub fn is_confirmed(&self) -> bool {
48 self.commitment == CommitmentLevel::Confirmed
49 }
50
51 pub fn is_processed(&self) -> bool {
52 self.commitment == CommitmentLevel::Processed
53 }
54
55 pub fn is_at_least_confirmed(&self) -> bool {
56 self.is_confirmed() || self.is_finalized()
57 }
58}
59
60impl FromStr for CommitmentConfig {
61 type Err = ParseCommitmentLevelError;
62
63 fn from_str(s: &str) -> Result<Self, Self::Err> {
64 CommitmentLevel::from_str(s).map(|commitment| Self { commitment })
65 }
66}
67
68#[cfg_attr(
69 feature = "serde",
70 derive(serde_derive::Serialize, serde_derive::Deserialize),
71 serde(rename_all = "camelCase")
72)]
73#[derive(Default, Clone, Copy, Debug, PartialEq, Eq, Hash)]
74pub enum CommitmentLevel {
79 Processed,
83
84 Confirmed,
89
90 #[default]
93 Finalized,
94}
95
96impl FromStr for CommitmentLevel {
97 type Err = ParseCommitmentLevelError;
98
99 fn from_str(s: &str) -> Result<Self, Self::Err> {
100 match s {
101 "processed" => Ok(CommitmentLevel::Processed),
102 "confirmed" => Ok(CommitmentLevel::Confirmed),
103 "finalized" => Ok(CommitmentLevel::Finalized),
104 _ => Err(ParseCommitmentLevelError::Invalid),
105 }
106 }
107}
108
109impl fmt::Display for CommitmentLevel {
110 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
111 let s = match self {
112 CommitmentLevel::Processed => "processed",
113 CommitmentLevel::Confirmed => "confirmed",
114 CommitmentLevel::Finalized => "finalized",
115 };
116 write!(f, "{s}")
117 }
118}
119
120#[derive(Debug)]
121pub enum ParseCommitmentLevelError {
122 Invalid,
123}
124
125impl core::error::Error for ParseCommitmentLevelError {}
126
127impl fmt::Display for ParseCommitmentLevelError {
128 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
129 match self {
130 Self::Invalid => f.write_str("invalid variant"),
131 }
132 }
133}