a1acb5bcb3
This allows constructing blob stores with a URL syntax at runtime, by passing the --blob-service-addr arg. We probably still want to have some builder pattern here, to allow additional schemes to be registered. Change-Id: Ie588ff7a7c6fb64c9474dfbd2e4bc5f168dfd778 Reviewed-on: https://cl.tvl.fyi/c/depot/+/8742 Reviewed-by: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI
31 lines
1.1 KiB
Rust
31 lines
1.1 KiB
Rust
use std::sync::Arc;
|
|
use url::Url;
|
|
|
|
use super::{BlobService, GRPCBlobService, MemoryBlobService, SledBlobService};
|
|
|
|
/// Constructs a new instance of a [BlobService] from an URI.
|
|
///
|
|
/// The following schemes are supported by the following services:
|
|
/// - `memory://` ([MemoryBlobService])
|
|
/// - `sled://` ([SledBlobService])
|
|
/// - `grpc+*://` ([GRPCBlobService])
|
|
///
|
|
/// See their [from_url] methods for more details about their syntax.
|
|
pub async fn from_addr(uri: &str) -> Result<Arc<dyn BlobService>, crate::Error> {
|
|
let url = Url::parse(uri).map_err(|e| {
|
|
crate::Error::StorageError(format!("unable to parse url: {}", e.to_string()))
|
|
})?;
|
|
|
|
Ok(if url.scheme() == "memory" {
|
|
Arc::new(MemoryBlobService::from_url(&url)?)
|
|
} else if url.scheme() == "sled" {
|
|
Arc::new(SledBlobService::from_url(&url)?)
|
|
} else if url.scheme().starts_with("grpc+") {
|
|
Arc::new(GRPCBlobService::from_url(&url)?)
|
|
} else {
|
|
Err(crate::Error::StorageError(format!(
|
|
"unknown scheme: {}",
|
|
url.scheme()
|
|
)))?
|
|
})
|
|
}
|