blob: b806331011e6c76154a35e78f9be788873a176c9 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use {
crate::local_mirror_manager::LocalMirrorManager,
anyhow::{Context as _, Error},
fidl_fuchsia_io::DirectoryProxy,
fidl_fuchsia_pkg::{LocalMirrorRequest, LocalMirrorRequestStream},
fidl_fuchsia_pkg_ext::RepositoryUrl,
futures::stream::TryStreamExt as _,
std::convert::TryFrom,
};
mod local_mirror_manager;
/// An implementation of fuchsia.pkg/LocalMirror.
pub struct PkgLocalMirror {
manager: LocalMirrorManager,
}
impl PkgLocalMirror {
pub async fn new(usb_dir: &DirectoryProxy) -> Result<Self, Error> {
Ok(Self { manager: LocalMirrorManager::new(usb_dir).await? })
}
/// Handle a fuchsia.pkg/LocalMirror request stream.
pub async fn handle_request_stream(
&self,
mut stream: LocalMirrorRequestStream,
) -> Result<(), Error> {
while let Some(request) =
stream.try_next().await.context("receiving LocalMirror request")?
{
self.handle_request(request).await?;
}
Ok(())
}
async fn handle_request(&self, request: LocalMirrorRequest) -> Result<(), Error> {
match request {
LocalMirrorRequest::GetMetadata { repo_url, path, metadata, responder } => {
let url = RepositoryUrl::try_from(&repo_url)
.with_context(|| format!("parsing repo url: {:?}", repo_url.url))?;
let mut response = self.manager.get_metadata(url, &path, metadata).await;
let () = responder.send(&mut response).context("sending GetMetadata response")?;
}
LocalMirrorRequest::GetBlob { blob_id, blob, responder } => {
let mut response = self.manager.get_blob(blob_id.into(), blob).await;
let () = responder.send(&mut response).context("sending GetBlob response")?;
}
}
Ok(())
}
}