// Copyright 2021 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.driver.development;

using fuchsia.driver.framework;

closed protocol DriverInfoIterator {
    /// Returns empty when no more entries left.
    strict GetNext() -> (struct {
        drivers vector<fuchsia.driver.framework.DriverInfo>:MAX;
    });
};

/// Used to page through a CompositeList.
closed protocol CompositeInfoIterator {
    /// Returns up to 100 entries at a time. Returns empty when no more
    /// composites are left.
    strict GetNext() -> (struct {
        composites vector<CompositeNodeInfo>:MAX;
    });
};

closed protocol CompositeNodeSpecIterator {
    /// Returns empty when no more node groups are left.
    strict GetNext() -> (struct {
        specs vector<fuchsia.driver.framework.CompositeInfo>:MAX;
    });
};

closed protocol NodeInfoIterator {
    /// Returns empty when no more entries left.
    strict GetNext() -> (struct {
        nodes vector<NodeInfo>:MAX;
    });
};
