Skip to content

Commit d55428c

Browse files
committed
refactor: deprecation handling
use initialization logic instead of serde
1 parent b4fdc3a commit d55428c

File tree

6 files changed

+130
-189
lines changed

6 files changed

+130
-189
lines changed

rewatch/src/build/compile.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -507,19 +507,15 @@ fn get_dependency_paths(
507507
build_dev_deps: bool,
508508
) -> Vec<Vec<String>> {
509509
let normal_deps = config
510-
.dependency_info
511510
.dependencies
512-
.value
513511
.clone()
514512
.unwrap_or_default()
515513
.into_iter()
516514
.map(DependentPackage::Normal)
517515
.collect();
518516
let dev_deps = if build_dev_deps {
519517
config
520-
.dependency_info
521518
.dev_dependencies
522-
.value
523519
.clone()
524520
.unwrap_or_default()
525521
.into_iter()

rewatch/src/build/deps.rs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,22 +37,11 @@ fn get_dep_modules(
3737
// Get the list of allowed dependency packages for this package
3838
let allowed_dependencies: AHashSet<String> = package
3939
.config
40-
.dependency_info
4140
.dependencies
42-
.value
4341
.as_ref()
4442
.unwrap_or(&vec![])
4543
.iter()
46-
.chain(
47-
package
48-
.config
49-
.dependency_info
50-
.dev_dependencies
51-
.value
52-
.as_ref()
53-
.unwrap_or(&vec![])
54-
.iter(),
55-
)
44+
.chain(package.config.dev_dependencies.as_ref().unwrap_or(&vec![]).iter())
5645
.cloned()
5746
.collect();
5847

rewatch/src/build/packages.rs

Lines changed: 29 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -239,16 +239,25 @@ pub fn read_config(package_dir: &Path) -> Result<config::Config> {
239239
};
240240

241241
config.inspect(|config| {
242-
if config.dependency_info.dependencies.deprecation_warning {
243-
deprecation_registry::log_deprecated_field("bs-dependencies", "dependencies", &config_path);
244-
}
245-
if config.dependency_info.dev_dependencies.deprecation_warning {
246-
deprecation_registry::log_deprecated_field(
247-
"bs-dev-dependencies",
248-
"dev-dependencies",
249-
&config_path,
250-
);
251-
}
242+
config
243+
.get_deprecations()
244+
.iter()
245+
.for_each(|deprecation_warning| match deprecation_warning {
246+
config::DeprecationWarning::BsDependencies => {
247+
deprecation_registry::log_deprecated_field(
248+
"bs-dependencies",
249+
"dependencies",
250+
&config_path,
251+
);
252+
}
253+
config::DeprecationWarning::BsDevDependencies => {
254+
deprecation_registry::log_deprecated_field(
255+
"bs-dev-dependencies",
256+
"dev-dependencies",
257+
&config_path,
258+
);
259+
}
260+
});
252261
})
253262
}
254263

@@ -312,8 +321,8 @@ fn read_dependencies(
312321
workspace_root: &Option<PathBuf>,
313322
show_progress: bool,
314323
) -> Vec<Dependency> {
315-
return parent_config.dependency_info.dependencies
316-
.to_owned().value
324+
return parent_config.dependencies
325+
.clone()
317326
.unwrap_or_default()
318327
.iter()
319328
.filter_map(|package_name| {
@@ -901,21 +910,9 @@ pub fn validate_packages_dependencies(packages: &AHashMap<String, Package>) -> b
901910
let mut detected_unallowed_dependencies: AHashMap<String, UnallowedDependency> = AHashMap::new();
902911

903912
for (package_name, package) in packages {
904-
let bs_dependencies = &package
905-
.config
906-
.dependency_info
907-
.dependencies
908-
.to_owned()
909-
.value
910-
.unwrap_or(vec![]);
913+
let bs_dependencies = &package.config.dependencies.to_owned().unwrap_or(vec![]);
911914
let pinned_dependencies = &package.config.pinned_dependencies.to_owned().unwrap_or(vec![]);
912-
let dev_dependencies = &package
913-
.config
914-
.dependency_info
915-
.dev_dependencies
916-
.to_owned()
917-
.value
918-
.unwrap_or(vec![]);
915+
let dev_dependencies = &package.config.dev_dependencies.to_owned().unwrap_or(vec![]);
919916

920917
[
921918
("bs-dependencies", bs_dependencies),
@@ -982,7 +979,6 @@ pub fn validate_packages_dependencies(packages: &AHashMap<String, Package>) -> b
982979
#[cfg(test)]
983980
mod test {
984981
use super::{Namespace, Package};
985-
use crate::config::{Dependencies, DependencyInfo, Source};
986982
use ahash::{AHashMap, AHashSet};
987983
use std::path::PathBuf;
988984

@@ -995,33 +991,13 @@ mod test {
995991
) -> Package {
996992
Package {
997993
name: name.clone(),
998-
config: crate::config::Config {
999-
name: name.clone(),
1000-
sources: Some(crate::config::OneOrMore::Single(Source::Shorthand(String::from(
1001-
"Source",
1002-
)))),
1003-
package_specs: None,
1004-
warnings: None,
1005-
suffix: None,
1006-
pinned_dependencies: Some(pinned_deps),
1007-
dependency_info: DependencyInfo {
1008-
dependencies: Dependencies {
1009-
deprecation_warning: false,
1010-
value: Some(bs_deps),
1011-
},
1012-
dev_dependencies: Dependencies {
1013-
deprecation_warning: false,
1014-
value: Some(build_dev_deps),
1015-
},
1016-
},
1017-
ppx_flags: None,
1018-
bsc_flags: None,
1019-
namespace: None,
1020-
jsx: None,
1021-
gentype_config: None,
1022-
namespace_entry: None,
994+
config: super::config::tests::create_config(
995+
name,
996+
bs_deps,
997+
pinned_deps,
998+
build_dev_deps,
1023999
allowed_dependents,
1024-
},
1000+
),
10251001
source_folders: AHashSet::new(),
10261002
source_files: None,
10271003
namespace: Namespace::Namespace(String::from("Package1")),

rewatch/src/config.rs

Lines changed: 98 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::build::packages;
22
use crate::helpers::deserialize::*;
3-
use anyhow::Result;
3+
use anyhow::{Result, bail};
44
use convert_case::{Case, Casing};
55
use serde::Deserialize;
66
use std::fs;
@@ -180,32 +180,10 @@ pub struct JsxSpecs {
180180
/// We do not care about the internal structure because the gentype config is loaded by bsc.
181181
pub type GenTypeConfig = serde_json::Value;
182182

183-
/// Wrapper around dependencies to emit a warning when the bs- prefix is used
184-
#[derive(Deserialize, Debug, Clone)]
185-
pub struct Dependencies {
186-
pub deprecation_warning: bool,
187-
pub value: Option<Vec<String>>,
188-
}
189-
190-
impl Default for Dependencies {
191-
fn default() -> Self {
192-
Self {
193-
deprecation_warning: false,
194-
value: None,
195-
}
196-
}
197-
}
198-
199-
impl From<Dependencies> for Option<Vec<String>> {
200-
fn from(dependencies: Dependencies) -> Self {
201-
dependencies.value
202-
}
203-
}
204-
205-
#[derive(Deserialize, Debug, Clone)]
206-
pub struct DependencyInfo {
207-
pub dependencies: Dependencies,
208-
pub dev_dependencies: Dependencies,
183+
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
184+
pub enum DeprecationWarning {
185+
BsDependencies,
186+
BsDevDependencies,
209187
}
210188

211189
/// # bsconfig.json representation
@@ -222,9 +200,18 @@ pub struct Config {
222200
pub suffix: Option<String>,
223201
#[serde(rename = "pinned-dependencies")]
224202
pub pinned_dependencies: Option<Vec<String>>,
225-
226-
#[serde(flatten, deserialize_with = "deserialize_dependencies")]
227-
pub dependency_info: DependencyInfo,
203+
pub dependencies: Option<Vec<String>>,
204+
#[serde(rename = "dev-dependencies")]
205+
pub dev_dependencies: Option<Vec<String>>,
206+
// Deprecated field: overwrites dependencies
207+
#[serde(rename = "bs-dependencies")]
208+
bs_dependencies: Option<Vec<String>>,
209+
// Deprecated field: overwrites dev_dependencies
210+
#[serde(rename = "bs-dev-dependencies")]
211+
bs_dev_dependencies: Option<Vec<String>>,
212+
// Holds all deprecation warnings for the config struct
213+
#[serde(skip)]
214+
deprecation_warnings: Vec<DeprecationWarning>,
228215

229216
#[serde(rename = "ppx-flags")]
230217
pub ppx_flags: Option<Vec<OneOrMore<String>>>,
@@ -349,9 +336,16 @@ impl Config {
349336
/// Try to convert a bsconfig from a certain path to a bsconfig struct
350337
pub fn new(path: &Path) -> Result<Self> {
351338
let read = fs::read_to_string(path)?;
352-
let parse = serde_json::from_str::<Config>(&read)?;
339+
Config::new_from_json_string(&read)
340+
}
341+
342+
/// Try to convert a bsconfig from a string to a bsconfig struct
343+
pub fn new_from_json_string(config_str: &str) -> Result<Self> {
344+
let mut config = serde_json::from_str::<Config>(config_str)?;
353345

354-
Ok(parse)
346+
config.handle_deprecations()?;
347+
348+
Ok(config)
355349
}
356350

357351
pub fn get_namespace(&self) -> packages::Namespace {
@@ -389,6 +383,7 @@ impl Config {
389383
},
390384
}
391385
}
386+
392387
pub fn get_jsx_args(&self) -> Vec<String> {
393388
match self.jsx.to_owned() {
394389
Some(jsx) => match jsx.version {
@@ -498,12 +493,70 @@ impl Config {
498493
.or(self.suffix.clone())
499494
.unwrap_or(".js".to_string())
500495
}
496+
497+
pub fn get_deprecations(&self) -> &[DeprecationWarning] {
498+
&self.deprecation_warnings
499+
}
500+
501+
fn handle_deprecations(&mut self) -> Result<()> {
502+
if self.dependencies.is_some() && self.bs_dependencies.is_some() {
503+
bail!("dependencies and bs-dependencies are mutually exclusive. Please use 'dependencies'.");
504+
}
505+
if self.dev_dependencies.is_some() && self.bs_dev_dependencies.is_some() {
506+
bail!(
507+
"dev-dependencies and bs-dev-dependencies are mutually exclusive. Please use 'dev-dependencies'"
508+
);
509+
}
510+
511+
if self.bs_dependencies.is_some() {
512+
self.dependencies = self.bs_dependencies.take();
513+
self.deprecation_warnings.push(DeprecationWarning::BsDependencies);
514+
}
515+
if self.bs_dev_dependencies.is_some() {
516+
self.dev_dependencies = self.bs_dev_dependencies.take();
517+
self.deprecation_warnings
518+
.push(DeprecationWarning::BsDevDependencies);
519+
}
520+
521+
Ok(())
522+
}
501523
}
502524

503525
#[cfg(test)]
504-
mod tests {
526+
pub mod tests {
505527
use super::*;
506528

529+
pub fn create_config(
530+
name: String,
531+
bs_deps: Vec<String>,
532+
pinned_deps: Vec<String>,
533+
build_dev_deps: Vec<String>,
534+
allowed_dependents: Option<Vec<String>>,
535+
) -> Config {
536+
Config {
537+
name: name.clone(),
538+
sources: Some(crate::config::OneOrMore::Single(Source::Shorthand(String::from(
539+
"Source",
540+
)))),
541+
package_specs: None,
542+
warnings: None,
543+
suffix: None,
544+
pinned_dependencies: Some(pinned_deps),
545+
dependencies: Some(bs_deps),
546+
bs_dependencies: None,
547+
dev_dependencies: Some(build_dev_deps),
548+
bs_dev_dependencies: None,
549+
ppx_flags: None,
550+
bsc_flags: None,
551+
namespace: None,
552+
jsx: None,
553+
gentype_config: None,
554+
namespace_entry: None,
555+
deprecation_warnings: vec![],
556+
allowed_dependents,
557+
}
558+
}
559+
507560
#[test]
508561
fn test_getters() {
509562
let json = r#"
@@ -718,12 +771,9 @@ mod tests {
718771
}
719772
"#;
720773

721-
let config = serde_json::from_str::<Config>(json).unwrap();
722-
assert_eq!(
723-
config.dependency_info.dependencies.value,
724-
Some(vec!["@testrepo/main".to_string()])
725-
);
726-
assert_eq!(config.dependency_info.dependencies.deprecation_warning, true)
774+
let config = Config::new_from_json_string(json).expect("a valid json string");
775+
assert_eq!(config.dependencies, Some(vec!["@testrepo/main".to_string()]));
776+
assert_eq!(config.get_deprecations(), [DeprecationWarning::BsDependencies]);
727777
}
728778

729779
#[test]
@@ -746,12 +796,9 @@ mod tests {
746796
}
747797
"#;
748798

749-
let config = serde_json::from_str::<Config>(json).unwrap();
750-
assert_eq!(
751-
config.dependency_info.dependencies.value,
752-
Some(vec!["@testrepo/main".to_string()])
753-
);
754-
assert_eq!(config.dependency_info.dependencies.deprecation_warning, false);
799+
let config = Config::new_from_json_string(json).expect("a valid json string");
800+
assert_eq!(config.dependencies, Some(vec!["@testrepo/main".to_string()]));
801+
assert_eq!(config.get_deprecations().is_empty(), true);
755802
}
756803

757804
#[test]
@@ -774,12 +821,9 @@ mod tests {
774821
}
775822
"#;
776823

777-
let config = serde_json::from_str::<Config>(json).unwrap();
778-
assert_eq!(
779-
config.dependency_info.dev_dependencies.value,
780-
Some(vec!["@testrepo/main".to_string()])
781-
);
782-
assert_eq!(config.dependency_info.dev_dependencies.deprecation_warning, true);
824+
let config = Config::new_from_json_string(json).expect("a valid json string");
825+
assert_eq!(config.dev_dependencies, Some(vec!["@testrepo/main".to_string()]));
826+
assert_eq!(config.get_deprecations(), [DeprecationWarning::BsDevDependencies]);
783827
}
784828

785829
#[test]
@@ -802,11 +846,8 @@ mod tests {
802846
}
803847
"#;
804848

805-
let config = serde_json::from_str::<Config>(json).unwrap();
806-
assert_eq!(
807-
config.dependency_info.dev_dependencies.value,
808-
Some(vec!["@testrepo/main".to_string()])
809-
);
810-
assert_eq!(config.dependency_info.dev_dependencies.deprecation_warning, false);
849+
let config = Config::new_from_json_string(json).expect("a valid json string");
850+
assert_eq!(config.dev_dependencies, Some(vec!["@testrepo/main".to_string()]));
851+
assert_eq!(config.get_deprecations().is_empty(), true);
811852
}
812853
}

0 commit comments

Comments
 (0)