// 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.
library fuchsia.hardware.block.partition;
using zx;
using fuchsia.hardware.block as block;
using fuchsia.device;

const GUID_LENGTH uint32 = 16;
const NAME_LENGTH uint32 = 128;

/// A Globally Unique IDentifier, which may be utilized to identify
/// a partition.
@for_deprecated_c_bindings
type GUID = struct {
    value array<uint8, GUID_LENGTH>;
};

/// Partition describes a region of one or more block devices, labelled
/// with distinguishing identifiers.
@for_deprecated_c_bindings
protocol Partition {
    compose block.Block;

    /// Gets the type GUID of the partition (if one exists).
    /// If the partition has no type GUID, ZX_ERR_NOT_SUPPORTED is returned.
    GetTypeGuid() -> (struct {
        status zx.status;
        guid box<GUID>;
    });

    /// Gets the instance GUID of the partition (if one exists).
    /// If the partition has no instance GUID, ZX_ERR_NOT_SUPPORTED is returned.
    GetInstanceGuid() -> (struct {
        status zx.status;
        guid box<GUID>;
    });

    /// Gets the name of the partition (if one exists).
    /// If the partition has no name, ZX_ERR_NOT_SUPPORTED is returned.
    GetName() -> (struct {
        status zx.status;
        name string:<NAME_LENGTH, optional>;
    });
};

/// Protocol for types which need to implement both Partition and
/// fuchsia.device.Controller.
protocol PartitionAndDevice {
    compose Partition;
    compose fuchsia.device.Controller;
};
