@@ -10,7 +10,7 @@ use strum::Display;
1010
1111use super :: foundation:: option_map:: OptionMap ;
1212use super :: { v0, Opt , ValidationSpec } ;
13- use crate :: name:: { OptName , OptNameBuf } ;
13+ use crate :: name:: OptName ;
1414use crate :: option:: VarOpt ;
1515use crate :: { Error , Result , Variant } ;
1616
@@ -20,6 +20,22 @@ mod build_spec_test;
2020
2121// TODO: could move to another file nearer the host_options() function
2222// in use super::foundation::option_map
23+
24+ // Each HostCompat value adds a different set of host related options when used.
25+ // TODO: move these to config
26+ const DISTRO_ADDS : & [ & OptName ] = & [ OptName :: os ( ) , OptName :: arch ( ) , OptName :: distro ( ) ] ;
27+ const ARCH_ADDS : & [ & OptName ] = & [ OptName :: os ( ) , OptName :: arch ( ) ] ;
28+ const OS_ADDS : & [ & OptName ] = & [ OptName :: os ( ) ] ;
29+ const ANY_ADDS : & [ & OptName ] = & [ ] ;
30+
31+ // Each HostCompat value disallows certain var names when host_compat
32+ // validation is enabled in the config file.
33+ // TODO: move these to config
34+ const DISTRO_DISALLOWS : & [ & OptName ] = & [ ] ;
35+ const ARCH_DISALLOWS : & [ & OptName ] = & [ OptName :: distro ( ) ] ;
36+ const OS_DISALLOWS : & [ & OptName ] = & [ OptName :: distro ( ) , OptName :: arch ( ) ] ;
37+ const ANY_DISALLOWS : & [ & OptName ] = & [ OptName :: distro ( ) , OptName :: arch ( ) , OptName :: os ( ) ] ;
38+
2339/// Set what level of cross-platform compatibility the built package
2440/// should have.
2541#[ derive(
@@ -37,33 +53,20 @@ pub enum HostCompat {
3753 Any ,
3854}
3955
40- // Each HostCompat value disallows certain var names when host_compat
41- // validation is enabled in the config file.
42- // TODO: move these to config
43- const DISTRO_DISALLOWS : & [ & OptName ] = & [ ] ;
44- const ARCH_DISALLOWS : & [ & OptName ] = & [ OptName :: distro ( ) ] ;
45- const OS_DISALLOWS : & [ & OptName ] = & [ OptName :: distro ( ) , OptName :: arch ( ) ] ;
46- const ANY_DISALLOWS : & [ & OptName ] = & [ OptName :: distro ( ) , OptName :: arch ( ) , OptName :: os ( ) ] ;
47-
4856impl HostCompat {
4957 pub fn is_default ( & self ) -> bool {
5058 self == & Self :: default ( )
5159 }
5260
53- fn names_added ( & self ) -> HashSet < OptNameBuf > {
54- // TODO: move this to constants/config
61+ fn names_added ( & self ) -> HashSet < & OptName > {
5562 let names = match self {
56- HostCompat :: Distro => vec ! [
57- OptName :: os( ) . to_owned( ) ,
58- OptName :: arch( ) . to_owned( ) ,
59- OptName :: distro( ) . to_owned( ) ,
60- ] ,
61- HostCompat :: Arch => vec ! [ OptName :: os( ) . to_owned( ) , OptName :: arch( ) . to_owned( ) ] ,
62- HostCompat :: Os => vec ! [ OptName :: os( ) . to_owned( ) ] ,
63- HostCompat :: Any => Vec :: new ( ) ,
63+ HostCompat :: Distro => DISTRO_ADDS ,
64+ HostCompat :: Arch => ARCH_ADDS ,
65+ HostCompat :: Os => OS_ADDS ,
66+ HostCompat :: Any => ANY_ADDS ,
6467 } ;
6568
66- names. into_iter ( ) . collect :: < HashSet < OptNameBuf > > ( )
69+ names. iter ( ) . copied ( ) . collect :: < HashSet < & OptName > > ( )
6770 }
6871
6972 /// Get host_options after filtering based on the cross Os
@@ -72,24 +75,28 @@ impl HostCompat {
7275 let all_host_options = spk_schema_foundation:: option_map:: host_options ( ) ?;
7376
7477 let mut names_added = self . names_added ( ) ;
78+ let distro_name;
7579 if HostCompat :: Distro == * self {
7680 match all_host_options. get ( OptName :: distro ( ) ) {
77- Some ( distro_name) => match OptNameBuf :: try_from ( distro_name. clone ( ) ) {
78- Ok ( name) => _ = names_added. insert ( name) ,
79- Err ( err) => {
80- return Err ( Error :: HostOptionNotValidDistroNameError (
81- distro_name. to_string ( ) ,
82- err,
83- ) )
81+ Some ( distro) => {
82+ distro_name = distro. clone ( ) ;
83+ match OptName :: new ( & distro_name) {
84+ Ok ( name) => _ = names_added. insert ( name) ,
85+ Err ( err) => {
86+ return Err ( Error :: HostOptionNotValidDistroNameError (
87+ distro_name. to_string ( ) ,
88+ err,
89+ ) )
90+ }
8491 }
85- } ,
92+ }
8693 None => return Err ( Error :: HostOptionNoDistroName ) ,
8794 }
8895 }
8996
9097 let mut settings = Vec :: new ( ) ;
9198 for ( name, value) in all_host_options. iter ( ) {
92- if names_added. contains ( name) {
99+ if names_added. contains ( & OptName :: new ( name) ? ) {
93100 let mut opt = Opt :: Var ( VarOpt :: new ( name) ?) ;
94101 opt. set_value ( value. to_string ( ) ) ?;
95102 settings. push ( opt)
0 commit comments