// 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 anyhow::Context;
use futures::TryStreamExt;
use {
    fidl_fuchsia_io as fio,
    fidl_fuchsia_pkg::{self as fpkg, PackageResolverRequestStream},
    fuchsia_url::{PackageVariant, UnpinnedAbsolutePackageUrl},
    futures::StreamExt,
};
pub async fn serve(stream: PackageResolverRequestStream) -> anyhow::Result<()> {
    stream
        .map(|result| result.context("failed request"))
        .try_for_each(|request| async {
            match request {
                fidl_fuchsia_pkg::PackageResolverRequest::Resolve {
                    package_url,
                    dir,
                    responder,
                } => {
                    let package_url = UnpinnedAbsolutePackageUrl::parse(&package_url)?;
                    let flags = fio::OpenFlags::RIGHT_READABLE | fio::OpenFlags::DIRECTORY;
                    fuchsia_fs::node::connect_in_namespace(
                        &format!(
                            "/pkgfs/packages/{}/{}",
                            package_url.name(),
                            package_url
                                .variant()
                                .cloned()
                                .unwrap_or_else(|| PackageVariant::zero())
                        ),
                        flags,
                        dir.into_channel(),
                    )?;
                    responder
                        .send(&mut Ok(fpkg::ResolutionContext { bytes: vec![] }))
                        .context("error sending response")?;
                }
                fidl_fuchsia_pkg::PackageResolverRequest::ResolveWithContext {
                    package_url: _,
                    context: _,
                    dir: _,
                    responder,
                } => {
                    // Not implemented for driver-index PackageResolver
                    responder
                        .send(&mut Err(fidl_fuchsia_pkg::ResolveError::Internal))
                        .context("error sending response")?;
                }
                fidl_fuchsia_pkg::PackageResolverRequest::GetHash { package_url: _, responder } => {
                    responder
                        .send(&mut Err(fuchsia_zircon::sys::ZX_ERR_UNAVAILABLE))
                        .context("error sending response")?;
                }
            }
            Ok(())
        })
        .await?;
    Ok(())
}
