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

/// DirectoryWatcher transmits messages from a filesystem server about
/// events happening in the filesystem. Clients can register new watchers
/// using the [`fuchsia.io2/Directory.Watch`] method, where they can
/// filter which events they want to receive notifications for.
protocol DirectoryWatcher {
    /// A hanging get to obtain the next batch of events.
    ///
    /// The caller should always use a receiving buffer size as large as the
    /// maximum channel limit.
    ///
    /// Clients should attempt to maintain one in-flight `GetNext` call as much
    /// as possible. If `GetNext` is not constantly polled, the filesystem
    /// server might hit an upper limit on the number of buffered events,
    /// resulting in dropping. Should this happen, the connection will be closed
    /// with a `ZX_ERR_IO_OVERRUN` epitaph.
    ///
    /// When the watched directory is deleted, this connection will be closed
    /// with a `ZX_ERR_UNAVAILABLE` epitaph.
    /// When the filesystem server is dying, this connection will be closed
    /// with a `ZX_ERR_PEER_CLOSED` epitaph.
    GetNext()
        -> (vector<DirectoryWatchedEvent>:MAX_DIRECTORY_BATCH_SIZE events);
};

table DirectoryWatchOptions {
};

/// Events returned from [`DirectoryWatcher.GetNext`].
flexible union DirectoryWatchedEvent {
    /// Indicates a node already existed in the directory when watching started.
    1: DirectoryEntry existing;

    /// Indicates that no more `existing` events will be sent.
    2: IdleEvent idle;

    /// Indicates a node has been created (either new or moved) into a
    /// directory.
    3: DirectoryEntry added;

    /// Indicates a node has been removed (either deleted or moved) from the
    /// directory.
    4: Name removed;
};

/// Used by [`fuchsia.io2/Directory.Watch`] to indicate the types of events
/// interested by a watcher.
bits DirectoryWatchMask : uint64 {
    /// Requests transmission of `existing` events.
    EXISTING = 0x01;

    /// Requests transmission of `idle` events.
    IDLE = 0x02;

    /// Requests transmission of `added` events.
    ADDED = 0x04;

    /// Requests transmission of `removed` events.
    REMOVED = 0x08;
};

struct IdleEvent {
};
