]> git.lizzy.rs Git - rust.git/commitdiff
return Error instead of panicking in from_cargo_metadata
authorMetabaron <metabaron@tuta.io>
Tue, 12 Nov 2019 10:53:31 +0000 (11:53 +0100)
committerMetabaron <metabaron@tuta.io>
Tue, 12 Nov 2019 11:01:13 +0000 (12:01 +0100)
crates/ra_db/src/input.rs
crates/ra_project_model/src/cargo_workspace.rs

index fb9a3297a47316326fbaa39851b02c7dfbb51d7f..472a15f2b9a228e8299e6b2a98df4b9c965bce22 100644 (file)
@@ -13,7 +13,7 @@
 use rustc_hash::FxHashSet;
 
 use crate::{RelativePath, RelativePathBuf};
-use std::str::FromStr;
+use std::{error::Error, str::FromStr};
 
 /// `FileId` is an integer which uniquely identifies a file. File paths are
 /// messy and system-dependent, so most of the code should work directly with
@@ -98,13 +98,18 @@ pub enum Edition {
     Edition2015,
 }
 
+#[derive(Debug)]
+pub struct ParseEditionError {
+    pub msg: String,
+}
+
 impl FromStr for Edition {
-    type Err = String;
+    type Err = ParseEditionError;
     fn from_str(s: &str) -> Result<Self, Self::Err> {
         match s {
             "2015" => Ok(Edition::Edition2015),
             "2018" => Ok(Edition::Edition2018),
-            _ => Err(format! {"unknown edition: {}" , s}),
+            _ => Err(ParseEditionError { msg: format!("unknown edition: {}", s) }),
         }
     }
 }
index ff96bf904d2260464d33089d0e5bae8302a429d2..cf88911b751b3a86e224f28155b1c63a734f266e 100644 (file)
@@ -141,20 +141,21 @@ pub fn from_cargo_metadata(cargo_toml: &Path) -> Result<CargoWorkspace> {
         let ws_members = &meta.workspace_members;
 
         for meta_pkg in meta.packages {
-            let is_member = ws_members.contains(&meta_pkg.id);
-            let name = meta_pkg.name;
+            let cargo_metadata::Package { id, edition, name, manifest_path, .. } = meta_pkg;
+            let is_member = ws_members.contains(&id);
+            let edition = Edition::from_str(&edition)
+                .map_err(|e| (format!("metadata for package {} failed: {}", &name, e.msg)))?;
             let pkg = packages.alloc(PackageData {
-                name: name.clone(),
-                manifest: meta_pkg.manifest_path.clone(),
+                name,
+                manifest: manifest_path,
                 targets: Vec::new(),
                 is_member,
-                edition: Edition::from_str(&meta_pkg.edition)
-                    .unwrap_or_else(|e| panic!("unknown edition {} for package {:?}", e, &name)),
+                edition,
                 dependencies: Vec::new(),
                 features: Vec::new(),
             });
             let pkg_data = &mut packages[pkg];
-            pkg_by_id.insert(meta_pkg.id.clone(), pkg);
+            pkg_by_id.insert(id, pkg);
             for meta_tgt in meta_pkg.targets {
                 let tgt = targets.alloc(TargetData {
                     pkg,