1- #![ expect( clippy:: result_large_err) ] // TODO: FIXME
2-
31pub mod fs;
42
53mod builtins;
4+ mod error;
65mod util;
76mod zip;
87
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} ;
148use std:: {
159 collections:: { HashMap , HashSet , hash_map:: Entry } ,
16- fmt,
1710 path:: { Path , PathBuf } ,
1811} ;
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- } ,
4612
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} ;
6318
64- issuer_locator : PackageLocator ,
65- issuer_path : PathBuf ,
66- } ,
67- }
19+ use crate :: util:: RegexDef ;
6820
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+ } ;
8125
8226#[ derive( Debug ) ]
8327pub enum Resolution {
@@ -206,9 +150,11 @@ pub fn parse_bare_identifier(specifier: &str) -> Result<(String, Option<String>)
206150 false => parse_global_package_name ( specifier) ,
207151 } ;
208152
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+ } ) )
212158 } )
213159}
214160
@@ -225,13 +171,14 @@ pub fn find_closest_pnp_manifest_path<P: AsRef<Path>>(p: P) -> Option<PathBuf> {
225171}
226172
227173pub 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 {
230176 message : format ! (
231177 "We failed to read the content of the manifest.\n \n Original error: {err}"
232178 ) ,
233179 manifest_path : p. as_ref ( ) . to_path_buf ( ) ,
234- } ) ?;
180+ } ) )
181+ } ) ?;
235182
236183 lazy_static ! {
237184 static ref RE : Regex = Regex :: new(
@@ -242,10 +189,10 @@ pub fn load_pnp_manifest<P: AsRef<Path>>(p: P) -> Result<Manifest, Error> {
242189
243190 let manifest_match = RE . find ( & manifest_content)
244191 . unwrap_or_default ( )
245- . ok_or_else ( || Error :: FailedManifestHydration {
192+ . ok_or_else ( || Error :: FailedManifestHydration ( Box :: new ( FailedManifestHydration {
246193 message : String :: from ( "We failed to locate the PnP data payload inside its manifest file. Did you manually edit the file?" ) ,
247194 manifest_path : p. as_ref ( ) . to_path_buf ( ) ,
248- } ) ?;
195+ } ) ) ) ?;
249196
250197 let iter = manifest_content. chars ( ) . skip ( manifest_match. end ( ) ) ;
251198 let mut json_string = String :: default ( ) ;
@@ -267,10 +214,10 @@ pub fn load_pnp_manifest<P: AsRef<Path>>(p: P) -> Result<Manifest, Error> {
267214 }
268215
269216 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 {
271218 message : format ! ( "We failed to parse the PnP data payload as proper JSON; Did you manually edit the file?\n \n Original error: {err}" ) ,
272219 manifest_path : p. as_ref ( ) . to_path_buf ( ) ,
273- } ) ?;
220+ } ) ) ) ?;
274221
275222 init_pnp_manifest ( & mut manifest, p. as_ref ( ) ) ;
276223
@@ -449,13 +396,13 @@ pub fn resolve_to_unqualified_via_manifest<P: AsRef<Path>>(
449396 )
450397 } ;
451398
452- return Err ( Error :: UndeclaredDependency {
399+ return Err ( Error :: UndeclaredDependency ( Box :: new ( UndeclaredDependency {
453400 message,
454401 request : specifier. to_string ( ) ,
455402 dependency_name : ident,
456403 issuer_locator : parent_locator. clone ( ) ,
457404 issuer_path : parent. as_ref ( ) . to_path_buf ( ) ,
458- } ) ;
405+ } ) ) ) ;
459406 }
460407
461408 if let Some ( resolution) = reference_or_alias {
@@ -513,14 +460,14 @@ pub fn resolve_to_unqualified_via_manifest<P: AsRef<Path>>(
513460 )
514461 } ;
515462
516- Err ( Error :: MissingPeerDependency {
463+ Err ( Error :: MissingPeerDependency ( Box :: new ( MissingPeerDependency {
517464 message,
518465 request : specifier. to_string ( ) ,
519466 dependency_name : ident,
520467 issuer_locator : parent_locator. clone ( ) ,
521468 issuer_path : parent. as_ref ( ) . to_path_buf ( ) ,
522469 broken_ancestors : [ ] . to_vec ( ) ,
523- } )
470+ } ) ) )
524471 }
525472 } else {
526473 Ok ( Resolution :: Skipped )
0 commit comments