syntax = "proto3";

package netmap;

option go_package = "github.com/nspcc-dev/neofs-api-go/netmap";
option csharp_namespace = "NeoFS.API.Netmap";

message PlacementRule {
    uint32 repl_factor = 1;

    message SFGroup {
        message Filter {
            string key = 1;

            message SimpleFilters {
                repeated SimpleFilter filters = 1;
            }

            message SimpleFilter {
                enum Operation {
                    NP = 0;
                    EQ = 1;
                    NE = 2;
                    GT = 3;
                    GE = 4;
                    LT = 5;
                    LE = 6;
                    OR = 7;
                    AND = 8;
                }

                Operation op = 1;

                oneof Args {
                    string value = 2;
                    SimpleFilters f_args = 3;
                }
            }

            SimpleFilter f = 2;
        }

        repeated Filter filters = 1;

        message Selector {
            uint32 count = 1;
            string key = 2;
        }

        repeated Selector selectors = 2;

        repeated uint32 exclude = 3;
    }

    repeated SFGroup sf_groups = 2;
}

// Groups the information about the NeoFS node.
message NodeInfo {
    // Carries network address of the NeoFS node.
    string address = 1;

    // Carries public key of the NeoFS node in a binary format.
    bytes public_key = 2;

    // Groups attributes of the NeoFS node.
    message Attribute {
        // Carries string key to the node attribute.
        string key = 1;

        // Carries string value of the node attribute.
        string value = 2;
    }

    // Carries list of the NeoFS node attributes in a string key-value format.
    repeated Attribute attributes = 3;

    // Represents the enumeration of various states of the NeoFS node.
    enum State {
        // Undefined state.
        UNKNOWN = 0;

        // Active state in the network.
        ONLINE = 1;

        // Network unavailable state.
        OFFLINE = 2;
    }

    // Carries state of the NeoFS node.
    State state = 4;
}