1
- use anyhow:: anyhow;
2
1
use bimap:: BiBTreeMap ;
3
2
use cid:: Cid ;
4
3
use fvm_ipld_blockstore:: Blockstore ;
5
- use fvm_ipld_encoding:: CborStore ;
4
+ use fvm_ipld_encoding:: { CborStore , CborStoreError } ;
6
5
use num_derive:: FromPrimitive ;
7
6
use serde_repr:: { Deserialize_repr , Serialize_repr } ;
8
7
@@ -107,26 +106,36 @@ impl From<&Type> for String {
107
106
/// A mapping of builtin actor CIDs to their respective types.
108
107
pub type Manifest = BiBTreeMap < Cid , Type > ;
109
108
110
- pub fn load_manifest < B : Blockstore > ( bs : & B , root_cid : & Cid , ver : u32 ) -> anyhow:: Result < Manifest > {
109
+ pub fn load_manifest < B : Blockstore > (
110
+ bs : & B ,
111
+ root_cid : & Cid ,
112
+ ver : u32 ,
113
+ ) -> Result < Manifest , ManifestError < B > > {
111
114
match ver {
112
115
0 => load_manifest_v0 ( bs, root_cid) ,
113
116
1 => load_manifest_v1 ( bs, root_cid) ,
114
- _ => Err ( anyhow ! ( "unknown manifest version {}" , ver) ) ,
117
+ _ => Err ( ManifestError :: UnknownVersion ( ver) ) ,
115
118
}
116
119
}
117
120
118
- pub fn load_manifest_v0 < B : Blockstore > ( bs : & B , root_cid : & Cid ) -> anyhow:: Result < Manifest > {
121
+ pub fn load_manifest_v0 < B : Blockstore > (
122
+ bs : & B ,
123
+ root_cid : & Cid ,
124
+ ) -> Result < Manifest , ManifestError < B > > {
119
125
match bs. get_cbor :: < Manifest > ( root_cid) ? {
120
126
Some ( mf) => Ok ( mf) ,
121
- None => Err ( anyhow ! ( "cannot find manifest root cid {}" , root_cid) ) ,
127
+ None => Err ( ManifestError :: MissingRootCid ( * root_cid) ) ,
122
128
}
123
129
}
124
130
125
- pub fn load_manifest_v1 < B : Blockstore > ( bs : & B , root_cid : & Cid ) -> anyhow:: Result < Manifest > {
131
+ pub fn load_manifest_v1 < B : Blockstore > (
132
+ bs : & B ,
133
+ root_cid : & Cid ,
134
+ ) -> Result < Manifest , ManifestError < B > > {
126
135
let vec: Vec < ( String , Cid ) > = match bs. get_cbor ( root_cid) ? {
127
136
Some ( vec) => vec,
128
137
None => {
129
- return Err ( anyhow ! ( "cannot find manifest root cid {}" , root_cid) ) ;
138
+ return Err ( ManifestError :: MissingRootCid ( * root_cid) ) ;
130
139
}
131
140
} ;
132
141
let mut manifest = Manifest :: new ( ) ;
@@ -137,9 +146,21 @@ pub fn load_manifest_v1<B: Blockstore>(bs: &B, root_cid: &Cid) -> anyhow::Result
137
146
manifest. insert ( code_cid, t) ;
138
147
}
139
148
Err ( what) => {
140
- return Err ( anyhow ! ( "bad builtin actor name: {}: {} " , name, what) ) ;
149
+ return Err ( ManifestError :: BadBuiltinActor ( name, what) ) ;
141
150
}
142
151
}
143
152
}
144
153
Ok ( manifest)
145
154
}
155
+
156
+ #[ derive( thiserror:: Error , Debug ) ]
157
+ pub enum ManifestError < BS : Blockstore > {
158
+ #[ error( "unknown manifest version {0}" ) ]
159
+ UnknownVersion ( u32 ) ,
160
+ #[ error( "cannot find manifest root cid {0}" ) ]
161
+ MissingRootCid ( Cid ) ,
162
+ #[ error( "bad builtin actor name: {0}: {1}" ) ]
163
+ BadBuiltinActor ( String , String ) ,
164
+ #[ error( "encoding {0}" ) ]
165
+ Encoding ( #[ from] CborStoreError < BS > ) ,
166
+ }
0 commit comments