@@ -6,7 +6,9 @@ use std::{
66
77use serde:: { Deserialize , Serialize } ;
88
9- use crate :: { label:: Label , package:: PackageRef , registry:: Registry , Error } ;
9+ use crate :: {
10+ label:: Label , metadata:: RegistryMetadata , package:: PackageRef , registry:: Registry , Error ,
11+ } ;
1012
1113mod toml;
1214
@@ -23,13 +25,35 @@ const DEFAULT_FALLBACK_NAMESPACE_REGISTRIES: &[(&str, &str)] =
2325#[ serde( into = "toml::TomlConfig" ) ]
2426pub struct Config {
2527 default_registry : Option < Registry > ,
26- namespace_registries : HashMap < Label , Registry > ,
27- package_registry_overrides : HashMap < PackageRef , Registry > ,
28+ namespace_registries : HashMap < Label , RegistryMapping > ,
29+ package_registry_overrides : HashMap < PackageRef , RegistryMapping > ,
2830 // Note: these are only used for hard-coded defaults currently
2931 fallback_namespace_registries : HashMap < Label , Registry > ,
3032 registry_configs : HashMap < Registry , RegistryConfig > ,
3133}
3234
35+ /// Possible options for namespace configuration.
36+ #[ derive( Debug , Clone , Serialize , Deserialize ) ]
37+ #[ serde( untagged) ]
38+ pub enum RegistryMapping {
39+ /// Use the given registry address (this will fetch the well-known registry metadata from the given hostname).
40+ Registry ( Registry ) ,
41+ /// Use custom configuration for reaching a registry
42+ Custom ( CustomConfig ) ,
43+ }
44+
45+ /// Custom registry configuration
46+ #[ derive( Debug , Clone , Serialize , Deserialize ) ]
47+ pub struct CustomConfig {
48+ /// A valid name for the registry. This still must be a valid [`Registry`] in that it should
49+ /// look like a valid hostname. When doing custom configuration however, this is just used as a
50+ /// key to identify the configuration for this namespace
51+ pub registry : Registry ,
52+ /// The metadata for the registry. This is used to determine the protocol to use for the
53+ /// registry as well as mapping information for the registry.
54+ pub metadata : RegistryMetadata ,
55+ }
56+
3357impl Default for Config {
3458 fn default ( ) -> Self {
3559 let fallback_namespace_registries = DEFAULT_FALLBACK_NAMESPACE_REGISTRIES
@@ -150,10 +174,20 @@ impl Config {
150174 /// - The default registry
151175 /// - Hard-coded fallbacks for certain well-known namespaces
152176 pub fn resolve_registry ( & self , package : & PackageRef ) -> Option < & Registry > {
153- if let Some ( reg) = self . package_registry_overrides . get ( package) {
177+ if let Some ( RegistryMapping :: Registry ( reg) ) = self . package_registry_overrides . get ( package) {
154178 Some ( reg)
155- } else if let Some ( reg) = self . namespace_registries . get ( package. namespace ( ) ) {
179+ } else if let Some ( RegistryMapping :: Custom ( custom) ) =
180+ self . package_registry_overrides . get ( package)
181+ {
182+ Some ( & custom. registry )
183+ } else if let Some ( RegistryMapping :: Registry ( reg) ) =
184+ self . namespace_registries . get ( package. namespace ( ) )
185+ {
156186 Some ( reg)
187+ } else if let Some ( RegistryMapping :: Custom ( custom) ) =
188+ self . namespace_registries . get ( package. namespace ( ) )
189+ {
190+ Some ( & custom. registry )
157191 } else if let Some ( reg) = self . default_registry . as_ref ( ) {
158192 Some ( reg)
159193 } else if let Some ( reg) = self . fallback_namespace_registries . get ( package. namespace ( ) ) {
@@ -179,25 +213,29 @@ impl Config {
179213 ///
180214 /// Does not fall back to the default registry; see
181215 /// [`Self::resolve_registry`].
182- pub fn namespace_registry ( & self , namespace : & Label ) -> Option < & Registry > {
216+ pub fn namespace_registry ( & self , namespace : & Label ) -> Option < & RegistryMapping > {
183217 self . namespace_registries . get ( namespace)
184218 }
185219
186220 /// Sets a registry for the given namespace.
187- pub fn set_namespace_registry ( & mut self , namespace : Label , registry : Registry ) {
221+ pub fn set_namespace_registry ( & mut self , namespace : Label , registry : RegistryMapping ) {
188222 self . namespace_registries . insert ( namespace, registry) ;
189223 }
190224
191225 /// Returns a registry override configured for the given package.
192226 ///
193227 /// Does not fall back to namespace or default registries; see
194228 /// [`Self::resolve_registry`].
195- pub fn package_registry_override ( & self , package : & PackageRef ) -> Option < & Registry > {
229+ pub fn package_registry_override ( & self , package : & PackageRef ) -> Option < & RegistryMapping > {
196230 self . package_registry_overrides . get ( package)
197231 }
198232
199233 /// Sets a registry override for the given package.
200- pub fn set_package_registry_override ( & mut self , package : PackageRef , registry : Registry ) {
234+ pub fn set_package_registry_override (
235+ & mut self ,
236+ package : PackageRef ,
237+ registry : RegistryMapping ,
238+ ) {
201239 self . package_registry_overrides . insert ( package, registry) ;
202240 }
203241
0 commit comments