// Copyright 2019 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.

#![feature(async_await, await_macro)]
#[macro_use]
mod common;
mod crypto_provider;
mod key_manager;
mod kms_asymmetric_key;
mod kms_sealing_key;

use crate::key_manager::KeyManager;

use failure::{Error, ResultExt};
use fidl_fuchsia_kms::KeyManagerRequestStream;
use fuchsia_async as fasync;
use fuchsia_component::server::ServiceFs;
use futures::prelude::*;
use log::error;
use std::sync::Arc;

fn main() -> Result<(), Error> {
    let mut executor = fasync::Executor::new().context("Error creating executor")?;
    let key_manager = Arc::new(KeyManager::new());
    let mut fs = ServiceFs::new();
    fs.dir("public").add_fidl_service(|stream| spawn(stream, Arc::clone(&key_manager)));
    fs.take_and_serve_directory_handle()?;
    let () = executor.run_singlethreaded(fs.collect());
    Ok(())
}

fn spawn(mut stream: KeyManagerRequestStream, key_manager: Arc<KeyManager>) {
    fasync::spawn(
        async move {
            while let Some(r) = await!(stream.try_next())? {
                key_manager.handle_request(r)?;
            }
            Ok(())
        }
            .unwrap_or_else(|e: fidl::Error| error!("Error handling KMS request: {:?}", e)),
    );
}
