@@ -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,91 @@ 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 > ,
68
86
{
69
- struct EmbeddedPackagesListVisitor ;
87
+ Ok ( deserializer
88
+ . deserialize_seq ( EmbeddedPackagesListVisitor :: default ( ) ) ?
89
+ . into ( ) )
90
+ }
91
+ }
70
92
71
- impl < ' de > serde:: de:: Visitor < ' de > for EmbeddedPackagesListVisitor {
72
- type Value = EmbeddedPackagesList ;
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 > ,
97
+ {
98
+ Ok ( deserializer
99
+ . deserialize_seq ( EmbeddedPackagesListVisitor :: default ( ) ) ?
100
+ . into ( ) )
101
+ }
102
+ }
73
103
74
- fn expecting ( & self , f : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
75
- f. write_str ( "a list of embedded packages" )
76
- }
104
+ impl < ' de > serde:: de:: Visitor < ' de > for EmbeddedPackagesListVisitor {
105
+ type Value = EmbeddedPackagesListVisitor ;
106
+
107
+ fn expecting ( & self , f : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
108
+ f. write_str ( "a list of embedded packages" )
109
+ }
77
110
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) )
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 ) ;
124
+
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
}
0 commit comments