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

//! Type-safe bindings for Zircon rights.

// Rights::NONE is not actually a flag but that's not very likely to be confusing
#![allow(clippy::bad_bit_mask)]

use bitflags::bitflags;
use fuchsia_zircon_sys as sys;

bitflags! {
    /// Rights associated with a handle.
    ///
    /// See [rights](https://fuchsia.dev/fuchsia-src/concepts/kernel/rights) for more information.
    #[repr(C)]
    #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
    pub struct Rights: sys::zx_rights_t {
        const NONE            = sys::ZX_RIGHT_NONE;
        const DUPLICATE       = sys::ZX_RIGHT_DUPLICATE;
        const TRANSFER        = sys::ZX_RIGHT_TRANSFER;
        const READ            = sys::ZX_RIGHT_READ;
        const WRITE           = sys::ZX_RIGHT_WRITE;
        const EXECUTE         = sys::ZX_RIGHT_EXECUTE;
        const MAP             = sys::ZX_RIGHT_MAP;
        const GET_PROPERTY    = sys::ZX_RIGHT_GET_PROPERTY;
        const SET_PROPERTY    = sys::ZX_RIGHT_SET_PROPERTY;
        const ENUMERATE       = sys::ZX_RIGHT_ENUMERATE;
        const DESTROY         = sys::ZX_RIGHT_DESTROY;
        const SET_POLICY      = sys::ZX_RIGHT_SET_POLICY;
        const GET_POLICY      = sys::ZX_RIGHT_GET_POLICY;
        const SIGNAL          = sys::ZX_RIGHT_SIGNAL;
        const SIGNAL_PEER     = sys::ZX_RIGHT_SIGNAL_PEER;
        const WAIT            = sys::ZX_RIGHT_WAIT;
        const INSPECT         = sys::ZX_RIGHT_INSPECT;
        const MANAGE_JOB      = sys::ZX_RIGHT_MANAGE_JOB;
        const MANAGE_PROCESS  = sys::ZX_RIGHT_MANAGE_PROCESS;
        const MANAGE_THREAD   = sys::ZX_RIGHT_MANAGE_THREAD;
        const APPLY_PROFILE   = sys::ZX_RIGHT_APPLY_PROFILE;
        const MANAGE_SOCKET   = sys::ZX_RIGHT_MANAGE_SOCKET;
        const RESIZE          = sys::ZX_RIGHT_RESIZE;
        const SAME_RIGHTS     = sys::ZX_RIGHT_SAME_RIGHTS;

        const BASIC           = sys::ZX_RIGHT_TRANSFER | sys::ZX_RIGHT_DUPLICATE |
                                sys::ZX_RIGHT_WAIT | sys::ZX_RIGHT_INSPECT;
        const IO              = sys::ZX_RIGHT_READ | sys::ZX_RIGHT_WRITE;
        const PROPERTY        = sys::ZX_RIGHT_GET_PROPERTY | sys::ZX_RIGHT_SET_PROPERTY;
        const POLICY          = sys::ZX_RIGHT_GET_POLICY | sys::ZX_RIGHT_SET_POLICY;
        const RESOURCE_BASIC  = sys::ZX_RIGHT_TRANSFER | sys::ZX_RIGHT_DUPLICATE |
                                sys::ZX_RIGHT_WRITE | sys::ZX_RIGHT_INSPECT;

        // Default rights for a newly created object of a particular type.
        // See zircon/system/public/zircon/rights.h
        const CHANNEL_DEFAULT = sys::ZX_RIGHT_TRANSFER | sys::ZX_RIGHT_WAIT |
                                sys::ZX_RIGHT_INSPECT |sys::ZX_RIGHT_READ |
                                sys::ZX_RIGHT_WRITE | sys::ZX_RIGHT_SIGNAL |
                                sys::ZX_RIGHT_SIGNAL_PEER;
        const VMO_DEFAULT     = Self::BASIC.bits() | Self::IO.bits() | Self::PROPERTY.bits() | Self::MAP.bits() | sys::ZX_RIGHT_SIGNAL;
    }
}
