Return Result from fallible registry functions

This updates the registry add_* functions to return a Result instead of
a bool on failure to force handling errors. The placeholder error is
used temporarily.

Change-Id: If9db8c2a442f75f2a0746e1774b7b3c6455bcbe5
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/qg/+/125211
Commit-Queue: Alexei Frolov <frolv@google.com>
Reviewed-by: Erik Gilling <konkers@google.com>
diff --git a/qg/src/project/mod.rs b/qg/src/project/mod.rs
index 430eee6..8d76556 100644
--- a/qg/src/project/mod.rs
+++ b/qg/src/project/mod.rs
@@ -191,7 +191,7 @@
             root_manifest_file.path(),
             false,
         );
-        registry.add_provider(project_provider);
+        registry.add_provider(project_provider)?;
 
         for (name, target) in root_manifest.targets {
             registry.add_target(crate::Target::from_manifest(
@@ -199,7 +199,7 @@
                 &root_manifest.project.name,
                 target.namespace.is_global(),
                 target,
-            )?);
+            )?)?;
         }
 
         for (provider, desc) in &root_manifest.providers {
@@ -217,7 +217,7 @@
                     provider,
                     provider_file.path(),
                     global_provider,
-                ));
+                ))?;
 
                 for (name, target) in provider_data.targets {
                     registry.add_target(crate::Target::from_manifest(
@@ -225,7 +225,7 @@
                         provider,
                         global_provider || target.namespace.is_global(),
                         target,
-                    )?);
+                    )?)?;
                 }
             }
         }
diff --git a/qg/src/registry.rs b/qg/src/registry.rs
index 376e0f7..8c3aa74 100644
--- a/qg/src/registry.rs
+++ b/qg/src/registry.rs
@@ -18,6 +18,7 @@
 };
 
 use crate::target::{Provider, Target};
+use crate::{Error, Result};
 
 /// A database of packages known to `qg`.
 #[derive(Debug)]
@@ -54,16 +55,21 @@
         self.targets.values().map(Arc::as_ref)
     }
 
-    pub(crate) fn add_provider(&mut self, provider: Provider) -> bool {
-        self.providers
-            .insert(provider.name.clone(), provider)
-            .is_none()
+    /// Registers a new provider.
+    pub(crate) fn add_provider(&mut self, provider: Provider) -> Result<()> {
+        if self.providers.contains_key(&provider.name) {
+            // TODO(frolv): Provider names must be unique.
+            return Err(Error::GenericErrorPlaceholder);
+        }
+        self.providers.insert(provider.name.clone(), provider);
+        Ok(())
     }
 
     /// Inserts a target into the registry.
-    pub(crate) fn add_target(&mut self, target: Target) -> bool {
+    pub(crate) fn add_target(&mut self, target: Target) -> Result<()> {
         if !self.providers.contains_key(target.provider()) {
-            return false;
+            // TODO(frolv): Target must have a known provider.
+            return Err(Error::GenericErrorPlaceholder);
         };
 
         let target_name = target.full_name();
@@ -80,7 +86,7 @@
         let target = Arc::new(target);
         self.targets.insert(target_name, target);
 
-        true
+        Ok(())
     }
 }