1
- #![ expect( clippy:: result_large_err) ] // TODO: FIXME
2
-
3
1
pub mod fs;
4
2
5
3
mod builtins;
4
+ mod error;
6
5
mod util;
7
6
mod zip;
8
7
9
- use fancy_regex:: Regex ;
10
- use indexmap:: IndexMap ;
11
- use lazy_static:: lazy_static;
12
- use serde:: { Deserialize , Serialize } ;
13
- use serde_with:: { DefaultOnNull , serde_as} ;
14
8
use std:: {
15
9
collections:: { HashMap , HashSet , hash_map:: Entry } ,
16
- fmt,
17
10
path:: { Path , PathBuf } ,
18
11
} ;
19
- use util:: RegexDef ;
20
-
21
- #[ derive( Clone , Debug , PartialEq , Serialize ) ]
22
- pub enum Error {
23
- BadSpecifier {
24
- message : String ,
25
-
26
- specifier : String ,
27
- } ,
28
-
29
- FailedManifestHydration {
30
- message : String ,
31
-
32
- manifest_path : PathBuf ,
33
- } ,
34
-
35
- MissingPeerDependency {
36
- message : String ,
37
- request : String ,
38
-
39
- dependency_name : String ,
40
-
41
- issuer_locator : PackageLocator ,
42
- issuer_path : PathBuf ,
43
-
44
- broken_ancestors : Vec < PackageLocator > ,
45
- } ,
46
12
47
- UndeclaredDependency {
48
- message : String ,
49
- request : String ,
50
-
51
- dependency_name : String ,
52
-
53
- issuer_locator : PackageLocator ,
54
- issuer_path : PathBuf ,
55
- } ,
56
-
57
- MissingDependency {
58
- message : String ,
59
- request : String ,
60
-
61
- dependency_locator : PackageLocator ,
62
- dependency_name : String ,
13
+ use fancy_regex:: Regex ;
14
+ use indexmap:: IndexMap ;
15
+ use lazy_static:: lazy_static;
16
+ use serde:: { Deserialize , Serialize } ;
17
+ use serde_with:: { DefaultOnNull , serde_as} ;
63
18
64
- issuer_locator : PackageLocator ,
65
- issuer_path : PathBuf ,
66
- } ,
67
- }
19
+ use crate :: util:: RegexDef ;
68
20
69
- impl fmt:: Display for Error {
70
- fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
71
- let message = match & self {
72
- Error :: BadSpecifier { message, .. } => message. clone ( ) ,
73
- Error :: FailedManifestHydration { message, .. } => message. clone ( ) ,
74
- Error :: MissingPeerDependency { message, .. } => message. clone ( ) ,
75
- Error :: UndeclaredDependency { message, .. } => message. clone ( ) ,
76
- Error :: MissingDependency { message, .. } => message. clone ( ) ,
77
- } ;
78
- write ! ( f, "{message}" )
79
- }
80
- }
21
+ pub use crate :: error:: {
22
+ BadSpecifier , Error , FailedManifestHydration , MissingDependency , MissingPeerDependency ,
23
+ UndeclaredDependency ,
24
+ } ;
81
25
82
26
#[ derive( Debug ) ]
83
27
pub enum Resolution {
@@ -206,9 +150,11 @@ pub fn parse_bare_identifier(specifier: &str) -> Result<(String, Option<String>)
206
150
false => parse_global_package_name ( specifier) ,
207
151
} ;
208
152
209
- name. ok_or_else ( || Error :: BadSpecifier {
210
- message : String :: from ( "Invalid specifier" ) ,
211
- specifier : specifier. to_string ( ) ,
153
+ name. ok_or_else ( || {
154
+ Error :: BadSpecifier ( Box :: new ( BadSpecifier {
155
+ message : String :: from ( "Invalid specifier" ) ,
156
+ specifier : specifier. to_string ( ) ,
157
+ } ) )
212
158
} )
213
159
}
214
160
@@ -225,13 +171,14 @@ pub fn find_closest_pnp_manifest_path<P: AsRef<Path>>(p: P) -> Option<PathBuf> {
225
171
}
226
172
227
173
pub fn load_pnp_manifest < P : AsRef < Path > > ( p : P ) -> Result < Manifest , Error > {
228
- let manifest_content =
229
- std :: fs :: read_to_string ( p . as_ref ( ) ) . map_err ( |err| Error :: FailedManifestHydration {
174
+ let manifest_content = std :: fs :: read_to_string ( p . as_ref ( ) ) . map_err ( |err| {
175
+ Error :: FailedManifestHydration ( Box :: new ( FailedManifestHydration {
230
176
message : format ! (
231
177
"We failed to read the content of the manifest.\n \n Original error: {err}"
232
178
) ,
233
179
manifest_path : p. as_ref ( ) . to_path_buf ( ) ,
234
- } ) ?;
180
+ } ) )
181
+ } ) ?;
235
182
236
183
lazy_static ! {
237
184
static ref RE : Regex = Regex :: new(
@@ -242,10 +189,10 @@ pub fn load_pnp_manifest<P: AsRef<Path>>(p: P) -> Result<Manifest, Error> {
242
189
243
190
let manifest_match = RE . find ( & manifest_content)
244
191
. unwrap_or_default ( )
245
- . ok_or_else ( || Error :: FailedManifestHydration {
192
+ . ok_or_else ( || Error :: FailedManifestHydration ( Box :: new ( FailedManifestHydration {
246
193
message : String :: from ( "We failed to locate the PnP data payload inside its manifest file. Did you manually edit the file?" ) ,
247
194
manifest_path : p. as_ref ( ) . to_path_buf ( ) ,
248
- } ) ?;
195
+ } ) ) ) ?;
249
196
250
197
let iter = manifest_content. chars ( ) . skip ( manifest_match. end ( ) ) ;
251
198
let mut json_string = String :: default ( ) ;
@@ -267,10 +214,10 @@ pub fn load_pnp_manifest<P: AsRef<Path>>(p: P) -> Result<Manifest, Error> {
267
214
}
268
215
269
216
let mut manifest: Manifest = serde_json:: from_str ( & json_string. to_owned ( ) )
270
- . map_err ( |err| Error :: FailedManifestHydration {
217
+ . map_err ( |err| Error :: FailedManifestHydration ( Box :: new ( FailedManifestHydration {
271
218
message : format ! ( "We failed to parse the PnP data payload as proper JSON; Did you manually edit the file?\n \n Original error: {err}" ) ,
272
219
manifest_path : p. as_ref ( ) . to_path_buf ( ) ,
273
- } ) ?;
220
+ } ) ) ) ?;
274
221
275
222
init_pnp_manifest ( & mut manifest, p. as_ref ( ) ) ;
276
223
@@ -449,13 +396,13 @@ pub fn resolve_to_unqualified_via_manifest<P: AsRef<Path>>(
449
396
)
450
397
} ;
451
398
452
- return Err ( Error :: UndeclaredDependency {
399
+ return Err ( Error :: UndeclaredDependency ( Box :: new ( UndeclaredDependency {
453
400
message,
454
401
request : specifier. to_string ( ) ,
455
402
dependency_name : ident,
456
403
issuer_locator : parent_locator. clone ( ) ,
457
404
issuer_path : parent. as_ref ( ) . to_path_buf ( ) ,
458
- } ) ;
405
+ } ) ) ) ;
459
406
}
460
407
461
408
if let Some ( resolution) = reference_or_alias {
@@ -513,14 +460,14 @@ pub fn resolve_to_unqualified_via_manifest<P: AsRef<Path>>(
513
460
)
514
461
} ;
515
462
516
- Err ( Error :: MissingPeerDependency {
463
+ Err ( Error :: MissingPeerDependency ( Box :: new ( MissingPeerDependency {
517
464
message,
518
465
request : specifier. to_string ( ) ,
519
466
dependency_name : ident,
520
467
issuer_locator : parent_locator. clone ( ) ,
521
468
issuer_path : parent. as_ref ( ) . to_path_buf ( ) ,
522
469
broken_ancestors : [ ] . to_vec ( ) ,
523
- } )
470
+ } ) ) )
524
471
}
525
472
} else {
526
473
Ok ( Resolution :: Skipped )
0 commit comments