@@ -8,7 +8,7 @@ use spk_schema_foundation::spec_ops::Named;
88use spk_schema_foundation:: IsDefault ;
99use spk_schema_ident:: AnyIdent ;
1010
11- use super :: { BuildSpec , InstallSpec , Spec } ;
11+ use super :: { BuildSpec , InstallSpec , Lint , LintedItem , Lints , Spec } ;
1212use crate :: component_embedded_packages:: ComponentEmbeddedPackage ;
1313use crate :: foundation:: ident_build:: Build ;
1414use crate :: Package ;
@@ -61,53 +61,142 @@ impl std::ops::DerefMut for EmbeddedPackagesList {
6161 }
6262}
6363
64+ #[ derive( Default ) ]
65+ struct EmbeddedPackagesListVisitor {
66+ embedded : Vec < Spec > ,
67+ lints : Vec < Lint > ,
68+ }
69+
70+ impl Lints for EmbeddedPackagesListVisitor {
71+ fn lints ( & mut self ) -> Vec < Lint > {
72+ std:: mem:: take ( & mut self . lints )
73+ }
74+ }
75+
76+ impl From < EmbeddedPackagesListVisitor > for EmbeddedPackagesList {
77+ fn from ( value : EmbeddedPackagesListVisitor ) -> Self {
78+ Self ( value. embedded )
79+ }
80+ }
81+
6482impl < ' de > Deserialize < ' de > for EmbeddedPackagesList {
6583 fn deserialize < D > ( deserializer : D ) -> std:: result:: Result < Self , D :: Error >
6684 where
67- D : serde:: Deserializer < ' de > ,
85+ D : serde:: de:: Deserializer < ' de > ,
86+ {
87+ Ok ( deserializer
88+ . deserialize_seq ( EmbeddedPackagesListVisitor :: default ( ) ) ?
89+ . into ( ) )
90+ }
91+ }
92+
93+ impl < ' de > Deserialize < ' de > for LintedItem < EmbeddedPackagesList > {
94+ fn deserialize < D > ( deserializer : D ) -> std:: result:: Result < Self , D :: Error >
95+ where
96+ D : serde:: de:: Deserializer < ' de > ,
6897 {
69- struct EmbeddedPackagesListVisitor ;
98+ Ok ( deserializer
99+ . deserialize_seq ( EmbeddedPackagesListVisitor :: default ( ) ) ?
100+ . into ( ) )
101+ }
102+ }
70103
71- impl < ' de > serde:: de:: Visitor < ' de > for EmbeddedPackagesListVisitor {
72- type Value = EmbeddedPackagesList ;
104+ impl < ' de > serde:: de:: Visitor < ' de > for EmbeddedPackagesListVisitor {
105+ type Value = EmbeddedPackagesListVisitor ;
73106
74- fn expecting ( & self , f : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
75- f. write_str ( "a list of embedded packages" )
76- }
107+ fn expecting ( & self , f : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
108+ f. write_str ( "a list of embedded packages" )
109+ }
110+
111+ fn visit_seq < A > ( self , mut seq : A ) -> std:: result:: Result < Self :: Value , A :: Error >
112+ where
113+ A : serde:: de:: SeqAccess < ' de > ,
114+ {
115+ let size_hint = seq. size_hint ( ) . unwrap_or ( 0 ) ;
116+ let mut lints = Vec :: new ( ) ;
117+ let mut embedded_stubs = Vec :: with_capacity ( size_hint) ;
118+ let mut default_build_spec = BuildSpec :: default ( ) ;
119+ let mut default_install_spec = InstallSpec :: default ( ) ;
120+ while let Some ( mut embedded) =
121+ seq. next_element :: < LintedItem < super :: v0:: Spec < AnyIdent > > > ( ) ?
122+ {
123+ lints. append ( & mut embedded. lints ) ;
77124
78- fn visit_seq < A > ( self , mut seq : A ) -> std:: result:: Result < Self :: Value , A :: Error >
79- where
80- A : serde:: de:: SeqAccess < ' de > ,
81- {
82- let size_hint = seq. size_hint ( ) . unwrap_or ( 0 ) ;
83- let mut embedded_stubs = Vec :: with_capacity ( size_hint) ;
84- let mut default_build_spec = BuildSpec :: default ( ) ;
85- let mut default_install_spec = InstallSpec :: default ( ) ;
86- while let Some ( embedded) = seq. next_element :: < super :: v0:: Spec < AnyIdent > > ( ) ? {
87- default_build_spec
88- . options
89- . clone_from ( & embedded. build . options ) ;
90- if default_build_spec != embedded. build {
91- return Err ( serde:: de:: Error :: custom (
92- "embedded packages can only specify build.options" ,
93- ) ) ;
94- }
95- default_install_spec. components = embedded. install . components . clone ( ) ;
96- if default_install_spec != embedded. install {
97- return Err ( serde:: de:: Error :: custom (
98- "embedded packages can only specify install.components" ,
99- ) ) ;
100- }
101- let embedded = embedded. map_ident ( |i| {
102- i. into_base ( )
103- . into_build_ident ( Build :: Embedded ( EmbeddedSource :: Unknown ) )
104- } ) ;
105- embedded_stubs. push ( Spec :: V0Package ( embedded) ) ;
106- }
107- Ok ( EmbeddedPackagesList ( embedded_stubs) )
125+ default_build_spec
126+ . options
127+ . clone_from ( & embedded. item . build . options ) ;
128+ if default_build_spec != embedded. item . build {
129+ return Err ( serde:: de:: Error :: custom (
130+ "embedded packages can only specify build.options" ,
131+ ) ) ;
108132 }
133+ default_install_spec. components = embedded. item . install . components . clone ( ) ;
134+ if default_install_spec != embedded. item . install {
135+ return Err ( serde:: de:: Error :: custom (
136+ "embedded packages can only specify install.components" ,
137+ ) ) ;
138+ }
139+ let embedded = embedded. item . map_ident ( |i| {
140+ i. into_base ( )
141+ . into_build_ident ( Build :: Embedded ( EmbeddedSource :: Unknown ) )
142+ } ) ;
143+ embedded_stubs. push ( Spec :: V0Package ( embedded) ) ;
109144 }
110145
111- deserializer. deserialize_seq ( EmbeddedPackagesListVisitor )
146+ Ok ( Self {
147+ embedded : embedded_stubs,
148+ lints,
149+ } )
112150 }
113151}
152+
153+ // impl<'de> Deserialize<'de> for EmbeddedPackagesList {
154+ // fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
155+ // where
156+ // D: serde::Deserializer<'de>,
157+ // {
158+ // struct EmbeddedPackagesListVisitor;
159+
160+ // impl<'de> serde::de::Visitor<'de> for EmbeddedPackagesListVisitor {
161+ // type Value = EmbeddedPackagesList;
162+
163+ // fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
164+ // f.write_str("a list of embedded packages")
165+ // }
166+
167+ // fn visit_seq<A>(self, mut seq: A) -> std::result::Result<Self::Value, A::Error>
168+ // where
169+ // A: serde::de::SeqAccess<'de>,
170+ // {
171+ // let size_hint = seq.size_hint().unwrap_or(0);
172+ // let mut embedded_stubs = Vec::with_capacity(size_hint);
173+ // let mut default_build_spec = BuildSpec::default();
174+ // let mut default_install_spec = InstallSpec::default();
175+ // while let Some(embedded) = seq.next_element::<LintedItem<super::v0::Spec<AnyIdent>>>()? {
176+ // default_build_spec
177+ // .options
178+ // .clone_from(&embedded.item.build.options);
179+ // if default_build_spec != embedded.build {
180+ // return Err(serde::de::Error::custom(
181+ // "embedded packages can only specify build.options",
182+ // ));
183+ // }
184+ // default_install_spec.components = embedded.item.install.components.clone();
185+ // if default_install_spec != embedded.item.install {
186+ // return Err(serde::de::Error::custom(
187+ // "embedded packages can only specify install.components",
188+ // ));
189+ // }
190+ // let embedded = embedded.map_ident(|i| {
191+ // i.into_base()
192+ // .into_build_ident(Build::Embedded(EmbeddedSource::Unknown))
193+ // });
194+ // embedded_stubs.push(Spec::V0Package(embedded));
195+ // }
196+ // Ok(EmbeddedPackagesList(embedded_stubs))
197+ // }
198+ // }
199+
200+ // deserializer.deserialize_seq(EmbeddedPackagesListVisitor)
201+ // }
202+ // }
0 commit comments