// syntax doc
syntax = "v1" // syntax comment

// import doc
import "foo.api" // import comment

import(
    // import group doc
    "bar.api" // import group comment
)

// info doc
info(// info comment
    // author doc
    author: "songmeizi" // author comment
    // date doc
    date: 2020-01-04 // date comment
    // desc doc
    desc: "break line
    desc" // desc comment
)


type (
    FooBar struct{
        Foo int
    }
    // remove struct
    Bar {
        // vString
        VString string `json:"vString"`
        // vBool
        VBool bool `json:"vBool"`
        // vInt8
        VInt8 int8 `json:"vInt8"`
        // vInt16
        VInt16 int16 `json:"vInt16"`
        // vInt32
        VInt32 int32 `json:"vInt32"`
        // vInt64
        VInt64 int64 `json:"vInt64"`
        // vInt
        VInt int `json:"vInt"`
        // vUInt8
        VUInt8 uint8 `json:"vUInt8"`
        // vUInt16
        VUInt16 uint16 `json:"vUInt16"`
        // vUInt32
        VUInt32 uint32 `json:"vUInt32"`
        // vUInt64
        VUInt64 uint64 `json:"vUInt64"`
        // vFloat32
        VFloat32 float32 `json:"vFloat32"`
        // vFloat64
        VFloat64 float64 `json:"vFloat64"`
        // vByte
        VByte byte `json:"vByte"`
        // vRune
        VRune rune `json:"vRune"`
        // vMap
        VMap map[string]int `json:"vMap"`
        // vArray
        VArray []int `json:"vArray"`
        // vStruct
        VStruct FooBar `json:"vStruct"`
        // vStructPointer
        VStructPointer *FooBar `json:"vStructPointer"`
        // vInterface
        VInterface interface{} `json:"vInterface"`
        // inline
        FooBar
    }
)

@server(
    host: 0.0.0.0
    port: 8080
    annotation: "break line
    desc"
)
service foo-api{
    @doc("foo")
    @handler postFoo
    // foo
    post /foo (FooBar) returns (FooBar)

    @doc(
        summary: bar
    )
    @server(
        handler: postBar
    )
    post /bar (FooBar)

    @doc("foobar")
    @handler postFooBar
    /**
    * httpmethod: post
    * path: /foo/bar
    * reply: FooBar
    */
    post /foo/bar returns (FooBar)

    @doc("barfoo")
    @handler postBarFoo
    post /bar/foo // post:/bar/foo

    @doc("barfoo")
    @handler getBarFoo
    get /bar/foo returns (FooBar)
}