@@ -13,6 +13,10 @@ use anyhow::{bail, Context, Result};
1313use futures_util:: TryStreamExt ;
1414use indexmap:: { IndexMap , IndexSet } ;
1515use semver:: { Comparator , Op , Version , VersionReq } ;
16+ use serde:: {
17+ de:: { self , value:: MapAccessDeserializer } ,
18+ Deserialize , Serialize ,
19+ } ;
1620use tokio:: io:: { AsyncRead , AsyncReadExt } ;
1721use wasm_pkg_client:: {
1822 caching:: { CachingClient , FileCache } ,
@@ -38,6 +42,108 @@ pub enum Dependency {
3842 Local ( PathBuf ) ,
3943}
4044
45+ impl Serialize for Dependency {
46+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
47+ where
48+ S : serde:: Serializer ,
49+ {
50+ match self {
51+ Self :: Package ( package) => {
52+ if package. name . is_none ( ) && package. registry . is_none ( ) {
53+ let version = package. version . to_string ( ) ;
54+ version. trim_start_matches ( '^' ) . serialize ( serializer)
55+ } else {
56+ #[ derive( Serialize ) ]
57+ struct Entry < ' a > {
58+ package : Option < & ' a PackageRef > ,
59+ version : & ' a str ,
60+ registry : Option < & ' a str > ,
61+ }
62+
63+ Entry {
64+ package : package. name . as_ref ( ) ,
65+ version : package. version . to_string ( ) . trim_start_matches ( '^' ) ,
66+ registry : package. registry . as_deref ( ) ,
67+ }
68+ . serialize ( serializer)
69+ }
70+ }
71+ Self :: Local ( path) => {
72+ #[ derive( Serialize ) ]
73+ struct Entry < ' a > {
74+ path : & ' a PathBuf ,
75+ }
76+
77+ Entry { path } . serialize ( serializer)
78+ }
79+ }
80+ }
81+ }
82+
83+ impl < ' de > Deserialize < ' de > for Dependency {
84+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
85+ where
86+ D : serde:: Deserializer < ' de > ,
87+ {
88+ struct Visitor ;
89+
90+ impl < ' de > de:: Visitor < ' de > for Visitor {
91+ type Value = Dependency ;
92+
93+ fn expecting ( & self , formatter : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
94+ write ! ( formatter, "a string or a table" )
95+ }
96+
97+ fn visit_str < E > ( self , s : & str ) -> Result < Self :: Value , E >
98+ where
99+ E : de:: Error ,
100+ {
101+ Ok ( Self :: Value :: Package ( s. parse ( ) . map_err ( de:: Error :: custom) ?) )
102+ }
103+
104+ fn visit_map < A > ( self , map : A ) -> Result < Self :: Value , A :: Error >
105+ where
106+ A : de:: MapAccess < ' de > ,
107+ {
108+ #[ derive( Default , Deserialize ) ]
109+ #[ serde( default , deny_unknown_fields) ]
110+ struct Entry {
111+ path : Option < PathBuf > ,
112+ package : Option < PackageRef > ,
113+ version : Option < VersionReq > ,
114+ registry : Option < String > ,
115+ }
116+
117+ let entry = Entry :: deserialize ( MapAccessDeserializer :: new ( map) ) ?;
118+
119+ match ( entry. path , entry. package , entry. version , entry. registry ) {
120+ ( Some ( path) , None , None , None ) => Ok ( Self :: Value :: Local ( path) ) ,
121+ ( None , name, Some ( version) , registry) => {
122+ Ok ( Self :: Value :: Package ( RegistryPackage {
123+ name,
124+ version,
125+ registry,
126+ } ) )
127+ }
128+ ( Some ( _) , None , Some ( _) , _) => Err ( de:: Error :: custom (
129+ "cannot specify both `path` and `version` fields in a dependency entry" ,
130+ ) ) ,
131+ ( Some ( _) , None , None , Some ( _) ) => Err ( de:: Error :: custom (
132+ "cannot specify both `path` and `registry` fields in a dependency entry" ,
133+ ) ) ,
134+ ( Some ( _) , Some ( _) , _, _) => Err ( de:: Error :: custom (
135+ "cannot specify both `path` and `package` fields in a dependency entry" ,
136+ ) ) ,
137+ ( None , None , _, _) => Err ( de:: Error :: missing_field ( "package" ) ) ,
138+ ( None , Some ( _) , None , _) => Err ( de:: Error :: missing_field ( "version" ) ) ,
139+ }
140+ }
141+ }
142+
143+ deserializer. deserialize_any ( Visitor )
144+ }
145+ }
146+
41147impl FromStr for Dependency {
42148 type Err = anyhow:: Error ;
43149
@@ -363,8 +469,10 @@ impl<'a> DependencyResolver<'a> {
363469 & mut self ,
364470 name : & PackageRef ,
365471 dependency : & Dependency ,
472+ is_wit : bool ,
366473 ) -> Result < ( ) > {
367- self . add_dependency_internal ( name, dependency, false ) . await
474+ self . add_dependency_internal ( name, dependency, false , is_wit)
475+ . await
368476 }
369477
370478 /// Add a dependency to the resolver. If the dependency already exists, then it will be
@@ -373,15 +481,18 @@ impl<'a> DependencyResolver<'a> {
373481 & mut self ,
374482 name : & PackageRef ,
375483 dependency : & Dependency ,
484+ is_wit : bool ,
376485 ) -> Result < ( ) > {
377- self . add_dependency_internal ( name, dependency, true ) . await
486+ self . add_dependency_internal ( name, dependency, true , is_wit)
487+ . await
378488 }
379489
380490 async fn add_dependency_internal (
381491 & mut self ,
382492 name : & PackageRef ,
383493 dependency : & Dependency ,
384494 force_override : bool ,
495+ is_wit : bool ,
385496 ) -> Result < ( ) > {
386497 match dependency {
387498 Dependency :: Package ( package) => {
@@ -434,13 +545,15 @@ impl<'a> DependencyResolver<'a> {
434545 return Ok ( ( ) ) ;
435546 }
436547
437- // Now that we check we haven't already inserted this dep, get the packages from the
438- // local dependency and add those to the resolver before adding the dependency
439- let ( _, packages) = get_packages ( p)
440- . context ( "Error getting dependent packages from local dependency" ) ?;
441- Box :: pin ( self . add_packages ( packages) )
442- . await
443- . context ( "Error adding packages to resolver for local dependency" ) ?;
548+ // // Now that we check we haven't already inserted this dep, get the packages from the
549+ // // local dependency and add those to the resolver before adding the dependency
550+ if is_wit {
551+ let ( _, packages) = get_packages ( p)
552+ . context ( "Error getting dependent packages from local dependency" ) ?;
553+ Box :: pin ( self . add_packages ( packages) )
554+ . await
555+ . context ( "Error adding packages to resolver for local dependency" ) ?;
556+ }
444557
445558 let prev = self . resolutions . insert ( name. clone ( ) , res) ;
446559 assert ! ( prev. is_none( ) ) ;
@@ -454,16 +567,17 @@ impl<'a> DependencyResolver<'a> {
454567 /// requirements to the resolver
455568 pub async fn add_packages (
456569 & mut self ,
457- packages : impl IntoIterator < Item = ( PackageRef , VersionReq ) > ,
570+ packages : impl IntoIterator < Item = ( PackageRef , VersionReq , bool ) > ,
458571 ) -> Result < ( ) > {
459- for ( package, req) in packages {
572+ for ( package, req, is_wit ) in packages {
460573 self . add_dependency (
461574 & package,
462575 & Dependency :: Package ( RegistryPackage {
463576 name : Some ( package. clone ( ) ) ,
464577 version : req,
465578 registry : None ,
466579 } ) ,
580+ is_wit,
467581 )
468582 . await ?;
469583 }
0 commit comments