@@ -8,7 +8,7 @@ use spk_schema_foundation::spec_ops::Named;
8
8
use spk_schema_foundation:: IsDefault ;
9
9
use spk_schema_ident:: AnyIdent ;
10
10
11
- use super :: { BuildSpec , InstallSpec , Spec } ;
11
+ use super :: { BuildSpec , InstallSpec , Lint , LintedItem , Lints , Spec } ;
12
12
use crate :: component_embedded_packages:: ComponentEmbeddedPackage ;
13
13
use crate :: foundation:: ident_build:: Build ;
14
14
use crate :: Package ;
@@ -61,53 +61,142 @@ impl std::ops::DerefMut for EmbeddedPackagesList {
61
61
}
62
62
}
63
63
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
+
64
82
impl < ' de > Deserialize < ' de > for EmbeddedPackagesList {
65
83
fn deserialize < D > ( deserializer : D ) -> std:: result:: Result < Self , D :: Error >
66
84
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 > ,
68
97
{
69
- struct EmbeddedPackagesListVisitor ;
98
+ Ok ( deserializer
99
+ . deserialize_seq ( EmbeddedPackagesListVisitor :: default ( ) ) ?
100
+ . into ( ) )
101
+ }
102
+ }
70
103
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 ;
73
106
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 ) ;
77
124
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
+ ) ) ;
108
132
}
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) ) ;
109
144
}
110
145
111
- deserializer. deserialize_seq ( EmbeddedPackagesListVisitor )
146
+ Ok ( Self {
147
+ embedded : embedded_stubs,
148
+ lints,
149
+ } )
112
150
}
113
151
}
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