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

use {
    anyhow::{Context as _, Error},
    fidl_fuchsia_mem as mem,
    fuchsia_zircon::{self as zx, HandleBased},
};

#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Ord, PartialOrd)]
pub struct AssetId(pub u32);

impl From<AssetId> for u32 {
    fn from(id: AssetId) -> u32 {
        id.0
    }
}

#[derive(Debug)]
pub struct Asset {
    pub id: AssetId,
    pub buffer: mem::Buffer,
}

impl Asset {
    /// Creates a new [`Asset`] instance with the same `id` and cloned of `buffer`.
    /// Returns [`Error`] if the `buffer` clone fails.
    pub fn try_clone(&self) -> Result<Asset, Error> {
        Ok(Asset { id: self.id, buffer: self.clone_buffer()? })
    }

    fn clone_buffer(&self) -> Result<mem::Buffer, Error> {
        let vmo_rights = zx::Rights::BASIC | zx::Rights::READ | zx::Rights::MAP;
        let vmo = self
            .buffer
            .vmo
            .duplicate_handle(vmo_rights)
            .context("Failed to duplicate VMO handle.")?;
        Ok(mem::Buffer { vmo, size: self.buffer.size })
    }
}
