1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
mod ping;
pub mod key_attributes;
mod create_key;
mod import_key;
mod export_public_key;
mod destroy_key;
mod asym_sign;
mod asym_verify;
mod list_opcodes;
mod list_providers;
use crate::requests::{request::RequestBody, response::ResponseBody, Opcode, Result};
pub use asym_sign::{OpAsymSign, ResultAsymSign};
pub use asym_verify::{OpAsymVerify, ResultAsymVerify};
pub use create_key::{OpCreateKey, ResultCreateKey};
pub use destroy_key::{OpDestroyKey, ResultDestroyKey};
pub use export_public_key::{OpExportPublicKey, ResultExportPublicKey};
pub use import_key::{OpImportKey, ResultImportKey};
pub use list_opcodes::{OpListOpcodes, ResultListOpcodes};
pub use list_providers::{OpListProviders, ProviderInfo, ResultListProviders};
pub use ping::{OpPing, ResultPing};
#[derive(Debug)]
pub enum NativeOperation {
ListProviders(OpListProviders),
ListOpcodes(OpListOpcodes),
Ping(OpPing),
CreateKey(OpCreateKey),
ImportKey(OpImportKey),
ExportPublicKey(OpExportPublicKey),
DestroyKey(OpDestroyKey),
AsymSign(OpAsymSign),
AsymVerify(OpAsymVerify),
}
impl NativeOperation {
pub fn opcode(&self) -> Opcode {
match self {
NativeOperation::Ping(_) => Opcode::Ping,
NativeOperation::CreateKey(_) => Opcode::CreateKey,
NativeOperation::DestroyKey(_) => Opcode::DestroyKey,
NativeOperation::AsymSign(_) => Opcode::AsymSign,
NativeOperation::AsymVerify(_) => Opcode::AsymVerify,
NativeOperation::ImportKey(_) => Opcode::ImportKey,
NativeOperation::ExportPublicKey(_) => Opcode::ExportPublicKey,
NativeOperation::ListOpcodes(_) => Opcode::ListOpcodes,
NativeOperation::ListProviders(_) => Opcode::ListProviders,
}
}
}
#[derive(Debug)]
pub enum NativeResult {
ListProviders(ResultListProviders),
ListOpcodes(ResultListOpcodes),
Ping(ResultPing),
CreateKey(ResultCreateKey),
ImportKey(ResultImportKey),
ExportPublicKey(ResultExportPublicKey),
DestroyKey(ResultDestroyKey),
AsymSign(ResultAsymSign),
AsymVerify(ResultAsymVerify),
}
impl NativeResult {
pub fn opcode(&self) -> Opcode {
match self {
NativeResult::Ping(_) => Opcode::Ping,
NativeResult::CreateKey(_) => Opcode::CreateKey,
NativeResult::DestroyKey(_) => Opcode::DestroyKey,
NativeResult::AsymSign(_) => Opcode::AsymSign,
NativeResult::AsymVerify(_) => Opcode::AsymVerify,
NativeResult::ImportKey(_) => Opcode::ImportKey,
NativeResult::ExportPublicKey(_) => Opcode::ExportPublicKey,
NativeResult::ListOpcodes(_) => Opcode::ListOpcodes,
NativeResult::ListProviders(_) => Opcode::ListProviders,
}
}
}
pub trait Convert {
fn body_to_operation(&self, body: RequestBody, opcode: Opcode) -> Result<NativeOperation>;
fn operation_to_body(&self, operation: NativeOperation) -> Result<RequestBody>;
fn body_to_result(&self, body: ResponseBody, opcode: Opcode) -> Result<NativeResult>;
fn result_to_body(&self, result: NativeResult) -> Result<ResponseBody>;
}