11#![ cfg( feature = "agave-unstable-api" ) ]
22#![ cfg_attr( feature = "frozen-abi" , feature( min_specialization) ) ]
33
4- pub use self :: legacy:: { LegacyVersion1 , LegacyVersion2 } ;
5- use {
6- rand:: { rng, Rng } ,
7- serde:: { Deserialize , Serialize } ,
8- solana_sanitize:: Sanitize ,
9- solana_serde_varint as serde_varint,
10- std:: { convert:: TryInto , fmt} ,
11- } ;
124#[ cfg_attr( feature = "frozen-abi" , macro_use) ]
135#[ cfg( feature = "frozen-abi" ) ]
146extern crate solana_frozen_abi_macro;
157
16- mod legacy;
8+ mod client_ids;
9+ pub mod v1;
10+ pub mod v2;
11+ pub mod v3;
1712
18- #[ derive( Debug , Eq , PartialEq ) ]
19- pub enum ClientId {
20- SolanaLabs ,
21- JitoLabs ,
22- Frankendancer ,
23- Agave ,
24- AgavePaladin ,
25- Firedancer ,
26- AgaveBam ,
27- Sig ,
28- // If new variants are added, update From<u16> and TryFrom<ClientId>.
29- Unknown ( u16 ) ,
30- }
31-
32- #[ cfg_attr( feature = "frozen-abi" , derive( AbiExample ) ) ]
33- #[ derive( Serialize , Deserialize , Clone , PartialEq , Eq ) ]
34- pub struct Version {
35- #[ serde( with = "serde_varint" ) ]
36- pub major : u16 ,
37- #[ serde( with = "serde_varint" ) ]
38- pub minor : u16 ,
39- #[ serde( with = "serde_varint" ) ]
40- pub patch : u16 ,
41- pub commit : u32 , // first 4 bytes of the sha1 commit hash
42- pub feature_set : u32 , // first 4 bytes of the FeatureSet identifier
43- #[ serde( with = "serde_varint" ) ]
44- client : u16 ,
45- }
46-
47- impl Version {
48- pub fn as_semver_version ( & self ) -> semver:: Version {
49- semver:: Version :: new ( self . major as u64 , self . minor as u64 , self . patch as u64 )
50- }
51-
52- pub fn client ( & self ) -> ClientId {
53- ClientId :: from ( self . client )
54- }
55- }
13+ pub use { client_ids:: * , v3:: * } ;
5614
57- fn compute_commit ( sha1 : Option < & ' static str > ) -> Option < u32 > {
15+ pub ( crate ) fn compute_commit ( sha1 : Option < & ' static str > ) -> Option < u32 > {
5816 u32:: from_str_radix ( sha1?. get ( ..8 ) ?, /*radix:*/ 16 ) . ok ( )
5917}
6018
61- impl Default for Version {
62- fn default ( ) -> Self {
63- let feature_set =
64- u32:: from_le_bytes ( agave_feature_set:: ID . as_ref ( ) [ ..4 ] . try_into ( ) . unwrap ( ) ) ;
65- Self {
66- major : env ! ( "CARGO_PKG_VERSION_MAJOR" ) . parse ( ) . unwrap ( ) ,
67- minor : env ! ( "CARGO_PKG_VERSION_MINOR" ) . parse ( ) . unwrap ( ) ,
68- patch : env ! ( "CARGO_PKG_VERSION_PATCH" ) . parse ( ) . unwrap ( ) ,
69- commit : compute_commit ( option_env ! ( "CI_COMMIT" ) )
70- . or ( compute_commit ( option_env ! ( "AGAVE_GIT_COMMIT_HASH" ) ) )
71- . unwrap_or_else ( || rng ( ) . random :: < u32 > ( ) ) ,
72- feature_set,
73- // Other client implementations need to modify this line.
74- client : u16:: try_from ( ClientId :: Agave ) . unwrap ( ) ,
75- }
76- }
77- }
78-
79- impl fmt:: Display for Version {
80- fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
81- write ! ( f, "{}.{}.{}" , self . major, self . minor, self . patch, )
82- }
83- }
84-
85- impl fmt:: Debug for Version {
86- fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
87- write ! (
88- f,
89- "{}.{}.{} (src:{:08x}; feat:{}, client:{:?})" ,
90- self . major,
91- self . minor,
92- self . patch,
93- self . commit,
94- self . feature_set,
95- self . client( ) ,
96- )
97- }
98- }
99-
100- impl Sanitize for Version { }
101-
102- impl From < u16 > for ClientId {
103- fn from ( client : u16 ) -> Self {
104- match client {
105- 0u16 => Self :: SolanaLabs ,
106- 1u16 => Self :: JitoLabs ,
107- 2u16 => Self :: Frankendancer ,
108- 3u16 => Self :: Agave ,
109- 4u16 => Self :: AgavePaladin ,
110- 5u16 => Self :: Firedancer ,
111- 6u16 => Self :: AgaveBam ,
112- 7u16 => Self :: Sig ,
113- _ => Self :: Unknown ( client) ,
114- }
115- }
116- }
117-
118- impl TryFrom < ClientId > for u16 {
119- type Error = String ;
120-
121- fn try_from ( client : ClientId ) -> Result < Self , Self :: Error > {
122- match client {
123- ClientId :: SolanaLabs => Ok ( 0u16 ) ,
124- ClientId :: JitoLabs => Ok ( 1u16 ) ,
125- ClientId :: Frankendancer => Ok ( 2u16 ) ,
126- ClientId :: Agave => Ok ( 3u16 ) ,
127- ClientId :: AgavePaladin => Ok ( 4u16 ) ,
128- ClientId :: Firedancer => Ok ( 5u16 ) ,
129- ClientId :: AgaveBam => Ok ( 6u16 ) ,
130- ClientId :: Sig => Ok ( 7u16 ) ,
131- ClientId :: Unknown ( client @ 0u16 ..=7u16 ) => Err ( format ! ( "Invalid client: {client}" ) ) ,
132- ClientId :: Unknown ( client) => Ok ( client) ,
133- }
134- }
135- }
136-
13719#[ macro_export]
13820macro_rules! semver {
13921 ( ) => {
@@ -159,36 +41,4 @@ mod test {
15941 assert_eq ! ( compute_commit( Some ( "HEAD" ) ) , None ) ;
16042 assert_eq ! ( compute_commit( Some ( "garbagein" ) ) , None ) ;
16143 }
162-
163- #[ test]
164- fn test_client_id ( ) {
165- assert_eq ! ( ClientId :: from( 0u16 ) , ClientId :: SolanaLabs ) ;
166- assert_eq ! ( ClientId :: from( 1u16 ) , ClientId :: JitoLabs ) ;
167- assert_eq ! ( ClientId :: from( 2u16 ) , ClientId :: Frankendancer ) ;
168- assert_eq ! ( ClientId :: from( 3u16 ) , ClientId :: Agave ) ;
169- assert_eq ! ( ClientId :: from( 4u16 ) , ClientId :: AgavePaladin ) ;
170- assert_eq ! ( ClientId :: from( 5u16 ) , ClientId :: Firedancer ) ;
171- assert_eq ! ( ClientId :: from( 6u16 ) , ClientId :: AgaveBam ) ;
172- assert_eq ! ( ClientId :: from( 7u16 ) , ClientId :: Sig ) ;
173- for client in 8u16 ..=u16:: MAX {
174- assert_eq ! ( ClientId :: from( client) , ClientId :: Unknown ( client) ) ;
175- }
176- assert_eq ! ( u16 :: try_from( ClientId :: SolanaLabs ) , Ok ( 0u16 ) ) ;
177- assert_eq ! ( u16 :: try_from( ClientId :: JitoLabs ) , Ok ( 1u16 ) ) ;
178- assert_eq ! ( u16 :: try_from( ClientId :: Frankendancer ) , Ok ( 2u16 ) ) ;
179- assert_eq ! ( u16 :: try_from( ClientId :: Agave ) , Ok ( 3u16 ) ) ;
180- assert_eq ! ( u16 :: try_from( ClientId :: AgavePaladin ) , Ok ( 4u16 ) ) ;
181- assert_eq ! ( u16 :: try_from( ClientId :: Firedancer ) , Ok ( 5u16 ) ) ;
182- assert_eq ! ( u16 :: try_from( ClientId :: AgaveBam ) , Ok ( 6u16 ) ) ;
183- assert_eq ! ( u16 :: try_from( ClientId :: Sig ) , Ok ( 7u16 ) ) ;
184- for client in 0 ..=7u16 {
185- assert_eq ! (
186- u16 :: try_from( ClientId :: Unknown ( client) ) ,
187- Err ( format!( "Invalid client: {client}" ) )
188- ) ;
189- }
190- for client in 8u16 ..=u16:: MAX {
191- assert_eq ! ( u16 :: try_from( ClientId :: Unknown ( client) ) , Ok ( client) ) ;
192- }
193- }
19444}
0 commit comments