// 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::{Error, Context as _};
use serde_derive::Deserialize;
use std::{fs, path::PathBuf};

#[derive(Clone, Debug, Default, Deserialize)]
pub struct DataFile {
    pub src: String,
    pub dst: String,
}

#[derive(Clone, Debug, Default, Deserialize)]
pub struct Manifest {
    #[serde(default)]
    pub library_search_paths: Vec<String>,
    #[serde(default)]
    pub additional_shared_libraries: Vec<String>,
    #[serde(default)]
    pub additional_static_libraries: Vec<String>,
    #[serde(default)]
    pub data_files: Vec<DataFile>,
}

pub fn load_manifest(manifest_path: &Option<PathBuf>) -> Result<Manifest, Error> {
    let cwd: PathBuf = if let Some(actual_manifest_path) = manifest_path.as_ref() {
        actual_manifest_path.parent().expect("manifest_path parent").to_path_buf()
    } else {
        std::fs::canonicalize(std::env::current_dir()?)
            .context("autotest: canonicalize working directory")?
    };
    let manifest_path = cwd.join("Fargo.toml");
    if !manifest_path.exists() {
        return Ok(Manifest::default());
    }
    let manifest_contents = fs::read_to_string(manifest_path)?;
    let manifest = toml::from_str(&manifest_contents)?;
    Ok(manifest)
}
