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(Clone, Copy, Debug, PartialEq, Eq, Hash)]
74pub enum CommitmentLevel {
79 Processed,
83
84 Confirmed,
89
90 Finalized,
93}
94
95impl Default for CommitmentLevel {
96 fn default() -> Self {
97 Self::Finalized
98 }
99}
100
101impl FromStr for CommitmentLevel {
102 type Err = ParseCommitmentLevelError;
103
104 fn from_str(s: &str) -> Result<Self, Self::Err> {
105 match s {
106 "processed" => Ok(CommitmentLevel::Processed),
107 "confirmed" => Ok(CommitmentLevel::Confirmed),
108 "finalized" => Ok(CommitmentLevel::Finalized),
109 _ => Err(ParseCommitmentLevelError::Invalid),
110 }
111 }
112}
113
114impl fmt::Display for CommitmentLevel {
115 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
116 let s = match self {
117 CommitmentLevel::Processed => "processed",
118 CommitmentLevel::Confirmed => "confirmed",
119 CommitmentLevel::Finalized => "finalized",
120 };
121 write!(f, "{s}")
122 }
123}
124
125#[derive(Debug)]
126pub enum ParseCommitmentLevelError {
127 Invalid,
128}
129
130impl core::error::Error for ParseCommitmentLevelError {}
131
132impl fmt::Display for ParseCommitmentLevelError {
133 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
134 match self {
135 Self::Invalid => f.write_str("invalid variant"),
136 }
137 }
138}