@@ -10,6 +10,7 @@ use log::error;
1010use parsec_interface:: operations:: list_providers:: ProviderInfo ;
1111use parsec_interface:: operations:: { list_opcodes, list_providers, ping} ;
1212use parsec_interface:: requests:: { Opcode , ProviderID , ResponseStatus , Result } ;
13+ use std:: collections:: { HashMap , HashSet } ;
1314use std:: io:: { Error , ErrorKind } ;
1415use std:: str:: FromStr ;
1516use uuid:: Uuid ;
@@ -26,37 +27,24 @@ const SUPPORTED_OPCODES: [Opcode; 3] = [Opcode::ListProviders, Opcode::ListOpcod
2627pub struct CoreProvider {
2728 wire_protocol_version_min : u8 ,
2829 wire_protocol_version_maj : u8 ,
29- providers : Vec < ProviderInfo > ,
30+ provider_info : Vec < ProviderInfo > ,
31+ provider_opcodes : HashMap < ProviderID , HashSet < Opcode > > ,
3032}
3133
3234impl Provide for CoreProvider {
33- fn list_opcodes ( & self , _op : list_opcodes:: Operation ) -> Result < list_opcodes:: Result > {
35+ fn list_opcodes ( & self , op : list_opcodes:: Operation ) -> Result < list_opcodes:: Result > {
3436 Ok ( list_opcodes:: Result {
35- opcodes : SUPPORTED_OPCODES . iter ( ) . copied ( ) . collect ( ) ,
37+ opcodes : self
38+ . provider_opcodes
39+ . get ( & op. provider_id )
40+ . ok_or ( ResponseStatus :: ProviderNotRegistered ) ?
41+ . clone ( ) ,
3642 } )
3743 }
3844
3945 fn list_providers ( & self , _op : list_providers:: Operation ) -> Result < list_providers:: Result > {
4046 Ok ( list_providers:: Result {
41- providers : self . providers . clone ( ) ,
42- } )
43- }
44-
45- fn describe ( & self ) -> Result < ProviderInfo > {
46- let crate_version: Version = Version :: from_str ( version ! ( ) ) . or_else ( |e| {
47- error ! ( "Error parsing the crate version: {}." , e) ;
48- Err ( ResponseStatus :: InvalidEncoding )
49- } ) ?;
50-
51- Ok ( ProviderInfo {
52- // Assigned UUID for this provider: 47049873-2a43-4845-9d72-831eab668784
53- uuid : Uuid :: parse_str ( "47049873-2a43-4845-9d72-831eab668784" ) . or ( Err ( ResponseStatus :: InvalidEncoding ) ) ?,
54- description : String :: from ( "Software provider that implements only administrative (i.e. no cryptographic) operations" ) ,
55- vendor : String :: new ( ) ,
56- version_maj : crate_version. major ,
57- version_min : crate_version. minor ,
58- version_rev : crate_version. patch ,
59- id : ProviderID :: Core ,
47+ providers : self . provider_info . clone ( ) ,
6048 } )
6149 }
6250
@@ -75,16 +63,46 @@ impl Provide for CoreProvider {
7563pub struct CoreProviderBuilder {
7664 version_maj : Option < u8 > ,
7765 version_min : Option < u8 > ,
78- providers : Option < Vec < ProviderInfo > > ,
66+ provider_info : Vec < ProviderInfo > ,
67+ provider_opcodes : HashMap < ProviderID , HashSet < Opcode > > ,
7968}
8069
8170impl CoreProviderBuilder {
82- pub fn new ( ) -> Self {
83- CoreProviderBuilder {
71+ pub fn new ( ) -> std:: io:: Result < Self > {
72+ let crate_version: Version = Version :: from_str ( version ! ( ) ) . or_else ( |e| {
73+ error ! ( "Error parsing the crate version: {}." , e) ;
74+ Err ( Error :: new (
75+ ErrorKind :: InvalidData ,
76+ "crate version number has invalid format" ,
77+ ) )
78+ } ) ?;
79+
80+ let provider_info = vec ! [ ProviderInfo {
81+ // Assigned UUID for this provider: 47049873-2a43-4845-9d72-831eab668784
82+ uuid: Uuid :: parse_str( "47049873-2a43-4845-9d72-831eab668784" ) . or_else( |_| Err ( Error :: new(
83+ ErrorKind :: InvalidData ,
84+ "provider UUID is invalid" ,
85+ ) ) ) ?,
86+ description: String :: from( "Software provider that implements only administrative (i.e. no cryptographic) operations" ) ,
87+ vendor: String :: new( ) ,
88+ version_maj: crate_version. major,
89+ version_min: crate_version. minor,
90+ version_rev: crate_version. patch,
91+ id: ProviderID :: Core ,
92+ } ] ;
93+
94+ let mut provider_opcodes = HashMap :: new ( ) ;
95+ let _ = provider_opcodes. insert (
96+ ProviderID :: Core ,
97+ SUPPORTED_OPCODES . iter ( ) . copied ( ) . collect ( ) ,
98+ ) ;
99+
100+ Ok ( CoreProviderBuilder {
84101 version_maj : None ,
85102 version_min : None ,
86- providers : None ,
87- }
103+ provider_info,
104+ provider_opcodes,
105+ } )
88106 }
89107
90108 pub fn with_wire_protocol_version ( mut self , version_min : u8 , version_maj : u8 ) -> Self {
@@ -94,44 +112,29 @@ impl CoreProviderBuilder {
94112 self
95113 }
96114
97- pub fn with_provider_info ( mut self , provider_info : ProviderInfo ) -> Self {
98- match self . providers {
99- Some ( mut providers) => {
100- providers. push ( provider_info) ;
101- self . providers = Some ( providers) ;
102- }
103- None => {
104- let mut providers = Vec :: new ( ) ;
105- providers. push ( provider_info) ;
106- self . providers = Some ( providers) ;
107- }
108- }
115+ pub fn with_provider_details (
116+ mut self ,
117+ provider_info : ProviderInfo ,
118+ opcodes : HashSet < Opcode > ,
119+ ) -> Self {
120+ let _ = self . provider_opcodes . insert ( provider_info. id , opcodes) ;
121+ self . provider_info . push ( provider_info) ;
109122
110123 self
111124 }
112125
113126 pub fn build ( self ) -> std:: io:: Result < CoreProvider > {
114- let mut core_provider = CoreProvider {
127+ let core_provider = CoreProvider {
115128 wire_protocol_version_maj : self
116129 . version_maj
117130 . ok_or_else ( || Error :: new ( ErrorKind :: InvalidData , "version maj is missing" ) ) ?,
118131 wire_protocol_version_min : self
119132 . version_min
120133 . ok_or_else ( || Error :: new ( ErrorKind :: InvalidData , "version min is missing" ) ) ?,
121- providers : self
122- . providers
123- . ok_or_else ( || Error :: new ( ErrorKind :: InvalidData , "provider info is missing" ) ) ?,
134+ provider_opcodes : self . provider_opcodes ,
135+ provider_info : self . provider_info ,
124136 } ;
125137
126- core_provider
127- . providers
128- . push ( core_provider. describe ( ) . or_else ( |_| {
129- Err ( Error :: new (
130- ErrorKind :: InvalidData ,
131- "error describing Core provider" ,
132- ) )
133- } ) ?) ;
134-
135138 Ok ( core_provider)
136139 }
137140}
@@ -145,7 +148,8 @@ mod tests {
145148 let provider = CoreProvider {
146149 wire_protocol_version_min : 8 ,
147150 wire_protocol_version_maj : 10 ,
148- providers : Vec :: new ( ) ,
151+ provider_info : Vec :: new ( ) ,
152+ provider_opcodes : HashMap :: new ( ) ,
149153 } ;
150154 let op = ping:: Operation { } ;
151155 let result = provider. ping ( op) . unwrap ( ) ;
0 commit comments