/*
 *   Copyright (c) 2014-2017 Nest Labs, Inc.
 *   All rights reserved.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

/*
 *
 *    ComplexMockTrait.proto
 *       This is a sample trait for the purposes of testing out the TDM layer. It should represent
 *       a relatively complex trait that tests out the various possibilities of expression in a trait
 *       as it applies to WDM testing.
 *
 */

syntax = "proto3";

package weave.trait.sample;

import "wdl/wdl_options.proto";

option (wdl.trait) = {
        vendor_id: 0x0000,
        id:        0x0014,
        version:   1
};

message _S3 {
    option (wdl.message_type) = STRUCT;

    uint32 a = 1;
    bool b = 2;
    string c = 3;
};

message _S1 {
    option (wdl.message_type) = STRUCT;

    _S3 s3 = 1;
    int32 d = 2;
};

message _S2 {
    option (wdl.message_type) = STRUCT;

    bool e = 1;
    int8 f = 2;
    uint16 g = 3;
};

message SampleTrait {
    option (wdl.message_type) = PROPERTIES;
    option (wdl.properties) = {
        writable: READ_ONLY,
    };

    _S1 s1 = 1;
    _S2 s2 = 2;
    int32 h = 3;
};
