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