forked from vikunja/vikunja
Update swaggo
This commit is contained in:
parent
f5e44d9eb3
commit
3cf2728629
14
go.mod
14
go.mod
|
@ -31,8 +31,8 @@ require (
|
||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible
|
github.com/dgrijalva/jwt-go v3.2.0+incompatible
|
||||||
github.com/fsnotify/fsnotify v1.4.9 // indirect
|
github.com/fsnotify/fsnotify v1.4.9 // indirect
|
||||||
github.com/fzipp/gocyclo v0.0.0-20150627053110-6acd4345c835
|
github.com/fzipp/gocyclo v0.0.0-20150627053110-6acd4345c835
|
||||||
github.com/go-openapi/jsonreference v0.19.3 // indirect
|
github.com/go-openapi/spec v0.19.8 // indirect
|
||||||
github.com/go-openapi/spec v0.19.4 // indirect
|
github.com/go-openapi/swag v0.19.9 // indirect
|
||||||
github.com/go-redis/redis/v7 v7.4.0
|
github.com/go-redis/redis/v7 v7.4.0
|
||||||
github.com/go-sql-driver/mysql v1.5.0
|
github.com/go-sql-driver/mysql v1.5.0
|
||||||
github.com/go-testfixtures/testfixtures/v3 v3.2.0
|
github.com/go-testfixtures/testfixtures/v3 v3.2.0
|
||||||
|
@ -45,7 +45,7 @@ require (
|
||||||
github.com/labstack/gommon v0.3.0
|
github.com/labstack/gommon v0.3.0
|
||||||
github.com/laurent22/ical-go v0.1.1-0.20181107184520-7e5d6ade8eef
|
github.com/laurent22/ical-go v0.1.1-0.20181107184520-7e5d6ade8eef
|
||||||
github.com/lib/pq v1.7.0
|
github.com/lib/pq v1.7.0
|
||||||
github.com/mailru/easyjson v0.7.0 // indirect
|
github.com/mailru/easyjson v0.7.1 // indirect
|
||||||
github.com/mattn/go-sqlite3 v2.0.3+incompatible
|
github.com/mattn/go-sqlite3 v2.0.3+incompatible
|
||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
|
||||||
github.com/olekukonko/tablewriter v0.0.4
|
github.com/olekukonko/tablewriter v0.0.4
|
||||||
|
@ -63,17 +63,17 @@ require (
|
||||||
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
||||||
github.com/spf13/viper v1.7.0
|
github.com/spf13/viper v1.7.0
|
||||||
github.com/stretchr/testify v1.6.1
|
github.com/stretchr/testify v1.6.1
|
||||||
github.com/swaggo/swag v1.6.3
|
github.com/swaggo/swag v1.6.7
|
||||||
github.com/ulule/limiter/v3 v3.5.0
|
github.com/ulule/limiter/v3 v3.5.0
|
||||||
github.com/urfave/cli v1.22.2 // indirect
|
|
||||||
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9
|
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9
|
||||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b
|
golang.org/x/lint v0.0.0-20200302205851-738671d3881b
|
||||||
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e // indirect
|
golang.org/x/net v0.0.0-20200602114024-627f9648deb9 // indirect
|
||||||
golang.org/x/tools v0.0.0-20200410194907-79a7a3126eef // indirect
|
golang.org/x/tools v0.0.0-20200612220849-54c614fe050c // indirect
|
||||||
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
|
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
|
||||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect
|
||||||
gopkg.in/d4l3k/messagediff.v1 v1.2.1
|
gopkg.in/d4l3k/messagediff.v1 v1.2.1
|
||||||
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
|
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
|
||||||
|
gopkg.in/yaml.v2 v2.3.0 // indirect
|
||||||
honnef.co/go/tools v0.0.1-2020.1.4
|
honnef.co/go/tools v0.0.1-2020.1.4
|
||||||
src.techknowlogick.com/xgo v0.0.0-20200602060627-a09175ea9056
|
src.techknowlogick.com/xgo v0.0.0-20200602060627-a09175ea9056
|
||||||
src.techknowlogick.com/xormigrate v1.2.1
|
src.techknowlogick.com/xormigrate v1.2.1
|
||||||
|
|
44
go.sum
44
go.sum
|
@ -98,8 +98,7 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
|
||||||
github.com/denisenkom/go-mssqldb v0.0.0-20190707035753-2be1aa521ff4 h1:YcpmyvADGYw5LqMnHqSkyIELsHCGF6PkrmM31V8rF7o=
|
github.com/denisenkom/go-mssqldb v0.0.0-20190707035753-2be1aa521ff4 h1:YcpmyvADGYw5LqMnHqSkyIELsHCGF6PkrmM31V8rF7o=
|
||||||
github.com/denisenkom/go-mssqldb v0.0.0-20190707035753-2be1aa521ff4/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM=
|
github.com/denisenkom/go-mssqldb v0.0.0-20190707035753-2be1aa521ff4/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM=
|
||||||
github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
|
github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
|
||||||
github.com/denisenkom/go-mssqldb v0.0.0-20200206145737-bbfc9a55622e h1:LzwWXEScfcTu7vUZNlDDWDARoSGEtvlDKK2BYHowNeE=
|
github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc h1:VRRKCwnzqk8QCaRC4os14xoKDdbHqqlJtJA0oc1ZAjg=
|
||||||
github.com/denisenkom/go-mssqldb v0.0.0-20200206145737-bbfc9a55622e/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
|
|
||||||
github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
|
github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
|
||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
|
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
|
||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||||
|
@ -146,18 +145,20 @@ github.com/go-openapi/spec v0.19.0 h1:A4SZ6IWh3lnjH0rG0Z5lkxazMGBECtrZcbyYQi+64k
|
||||||
github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
|
github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
|
||||||
github.com/go-openapi/spec v0.19.4 h1:ixzUSnHTd6hCemgtAJgluaTSGYpLNpJY4mA2DIkdOAo=
|
github.com/go-openapi/spec v0.19.4 h1:ixzUSnHTd6hCemgtAJgluaTSGYpLNpJY4mA2DIkdOAo=
|
||||||
github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
|
github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
|
||||||
|
github.com/go-openapi/spec v0.19.8 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg=
|
||||||
|
github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
|
||||||
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
|
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
|
||||||
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
||||||
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
|
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
|
||||||
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
||||||
|
github.com/go-openapi/swag v0.19.9 h1:1IxuqvBUU3S2Bi4YC7tlP9SJF1gVpCvqN0T2Qof4azE=
|
||||||
|
github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY=
|
||||||
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||||
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
|
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
|
||||||
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
|
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
|
||||||
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
|
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
|
||||||
github.com/go-redis/redis/v7 v7.2.0 h1:CrCexy/jYWZjW0AyVoHlcJUeZN19VWlbepTh1Vq6dJs=
|
github.com/go-redis/redis/v7 v7.2.0 h1:CrCexy/jYWZjW0AyVoHlcJUeZN19VWlbepTh1Vq6dJs=
|
||||||
github.com/go-redis/redis/v7 v7.2.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
|
github.com/go-redis/redis/v7 v7.2.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
|
||||||
github.com/go-redis/redis/v7 v7.3.0 h1:3oHqd0W7f/VLKBxeYTEpqdMUsmMectngjM9OtoRoIgg=
|
|
||||||
github.com/go-redis/redis/v7 v7.3.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
|
|
||||||
github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4=
|
github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4=
|
||||||
github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
|
github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
|
||||||
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
|
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
|
||||||
|
@ -315,8 +316,6 @@ github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
|
||||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
github.com/lib/pq v1.3.0 h1:/qkRGz8zljWiDcFvgpwUpwIAPu3r07TDvs3Rws+o/pU=
|
github.com/lib/pq v1.3.0 h1:/qkRGz8zljWiDcFvgpwUpwIAPu3r07TDvs3Rws+o/pU=
|
||||||
github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
github.com/lib/pq v1.5.2 h1:yTSXVswvWUOQ3k1sd7vJfDrbSl8lKuscqFJRqjC0ifw=
|
|
||||||
github.com/lib/pq v1.5.2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
|
||||||
github.com/lib/pq v1.6.0 h1:I5DPxhYJChW9KYc66se+oKFFQX6VuQrKiprsX6ivRZc=
|
github.com/lib/pq v1.6.0 h1:I5DPxhYJChW9KYc66se+oKFFQX6VuQrKiprsX6ivRZc=
|
||||||
github.com/lib/pq v1.6.0/go.mod h1:4vXEAYvW1fRQ2/FhZ78H73A60MHw1geSm145z2mdY1g=
|
github.com/lib/pq v1.6.0/go.mod h1:4vXEAYvW1fRQ2/FhZ78H73A60MHw1geSm145z2mdY1g=
|
||||||
github.com/lib/pq v1.7.0 h1:h93mCPfUSkaul3Ka/VG8uZdmW1uMHDGxzu0NWHuJmHY=
|
github.com/lib/pq v1.7.0 h1:h93mCPfUSkaul3Ka/VG8uZdmW1uMHDGxzu0NWHuJmHY=
|
||||||
|
@ -329,8 +328,8 @@ github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3
|
||||||
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM=
|
github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8=
|
||||||
github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
|
github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
|
||||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||||
github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
|
github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
|
||||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||||
|
@ -447,6 +446,7 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR
|
||||||
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
|
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
|
||||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
||||||
|
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
||||||
github.com/shopspring/decimal v0.0.0-20191009025716-f1972eb1d1f5/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
|
github.com/shopspring/decimal v0.0.0-20191009025716-f1972eb1d1f5/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
|
||||||
github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk=
|
github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk=
|
||||||
|
@ -502,8 +502,8 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69
|
||||||
github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14/go.mod h1:gxQT6pBGRuIGunNf/+tSOB5OHvguWi8Tbt82WOkf35E=
|
github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14/go.mod h1:gxQT6pBGRuIGunNf/+tSOB5OHvguWi8Tbt82WOkf35E=
|
||||||
github.com/swaggo/gin-swagger v1.2.0/go.mod h1:qlH2+W7zXGZkczuL+r2nEBR2JTT+/lX05Nn6vPhc7OI=
|
github.com/swaggo/gin-swagger v1.2.0/go.mod h1:qlH2+W7zXGZkczuL+r2nEBR2JTT+/lX05Nn6vPhc7OI=
|
||||||
github.com/swaggo/swag v1.5.1/go.mod h1:1Bl9F/ZBpVWh22nY0zmYyASPO1lI/zIwRDrpZU+tv8Y=
|
github.com/swaggo/swag v1.5.1/go.mod h1:1Bl9F/ZBpVWh22nY0zmYyASPO1lI/zIwRDrpZU+tv8Y=
|
||||||
github.com/swaggo/swag v1.6.3 h1:N+uVPGP4H2hXoss2pt5dctoSUPKKRInr6qcTMOm0usI=
|
github.com/swaggo/swag v1.6.7 h1:e8GC2xDllJZr3omJkm9YfmK0Y56+rMO3cg0JBKNz09s=
|
||||||
github.com/swaggo/swag v1.6.3/go.mod h1:wcc83tB4Mb2aNiL/HP4MFeQdpHUrca+Rp/DRNgWAUio=
|
github.com/swaggo/swag v1.6.7/go.mod h1:xDhTyuFIujYiN3DKWC/H/83xcfHp+UE/IzWWampG7Zc=
|
||||||
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
|
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
|
||||||
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
|
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||||
|
@ -517,8 +517,8 @@ github.com/ulule/limiter/v3 v3.5.0 h1:QRAebbswjlezHIfiSQgM8+jMxaz/zsrxGRuiUJ43MH
|
||||||
github.com/ulule/limiter/v3 v3.5.0/go.mod h1:TgOUQZKZ2KHjemqrC8UHUbKPqpTmSY43/2wbQ7YN1h8=
|
github.com/ulule/limiter/v3 v3.5.0/go.mod h1:TgOUQZKZ2KHjemqrC8UHUbKPqpTmSY43/2wbQ7YN1h8=
|
||||||
github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
|
github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
|
||||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||||
github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo=
|
github.com/urfave/cli/v2 v2.1.1 h1:Qt8FeAtxE/vfdrLmR3rxR6JRE0RoVmbXu8+6kZtYU4k=
|
||||||
github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
|
||||||
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
||||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||||
github.com/valyala/fasthttp v1.9.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w=
|
github.com/valyala/fasthttp v1.9.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w=
|
||||||
|
@ -553,10 +553,6 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
|
||||||
golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw=
|
|
||||||
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
|
||||||
golang.org/x/crypto v0.0.0-20200602180216-279210d13fed h1:g4KENRiCMEx58Q7/ecwfT0N2o8z35Fnbsjig/Alf2T4=
|
|
||||||
golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
|
||||||
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM=
|
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM=
|
||||||
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
|
@ -611,8 +607,8 @@ golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLL
|
||||||
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k=
|
golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM=
|
||||||
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0=
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0=
|
||||||
|
@ -696,8 +692,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
|
||||||
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7 h1:EBZoQjiKKPaLbPrbpssUfuHtwM6KV/vb4U85g/cigFY=
|
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7 h1:EBZoQjiKKPaLbPrbpssUfuHtwM6KV/vb4U85g/cigFY=
|
||||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
golang.org/x/tools v0.0.0-20200410194907-79a7a3126eef h1:RHORRhs540cYZYrzgU2CPUyykkwZM78hGdzocOo9P8A=
|
golang.org/x/tools v0.0.0-20200612220849-54c614fe050c h1:g6oFfz6Cmw68izP3xsdud3Oxu145IPkeFzyRg58AKHM=
|
||||||
golang.org/x/tools v0.0.0-20200410194907-79a7a3126eef/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
golang.org/x/tools v0.0.0-20200612220849-54c614fe050c/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||||
|
@ -776,6 +772,8 @@ gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo=
|
||||||
gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
|
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
|
||||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
|
||||||
|
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
@ -788,14 +786,8 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt
|
||||||
honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8=
|
honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8=
|
||||||
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||||
src.techknowlogick.com/xgo v0.0.0-20200514233805-209a5cf70012 h1:k1/qGRpsaGka4IHT2UIUdPqM6+oo3O7+8S3ACN2kJZQ=
|
|
||||||
src.techknowlogick.com/xgo v0.0.0-20200514233805-209a5cf70012/go.mod h1:31CE1YKtDOrKTk9PSnjTpe6YbO6W/0LTYZ1VskL09oU=
|
|
||||||
src.techknowlogick.com/xgo v0.0.0-20200601230223-eeb7c0a673dd h1:6hliDQiQTI45t45ECQxdnLhdkd8y96dsBeeun0A/9jQ=
|
|
||||||
src.techknowlogick.com/xgo v0.0.0-20200601230223-eeb7c0a673dd/go.mod h1:31CE1YKtDOrKTk9PSnjTpe6YbO6W/0LTYZ1VskL09oU=
|
|
||||||
src.techknowlogick.com/xgo v0.0.0-20200602060627-a09175ea9056 h1:9XYMVs36yGHbSNs+m7kHg5lQnTOie2bMLM1c8LtAoXs=
|
src.techknowlogick.com/xgo v0.0.0-20200602060627-a09175ea9056 h1:9XYMVs36yGHbSNs+m7kHg5lQnTOie2bMLM1c8LtAoXs=
|
||||||
src.techknowlogick.com/xgo v0.0.0-20200602060627-a09175ea9056/go.mod h1:31CE1YKtDOrKTk9PSnjTpe6YbO6W/0LTYZ1VskL09oU=
|
src.techknowlogick.com/xgo v0.0.0-20200602060627-a09175ea9056/go.mod h1:31CE1YKtDOrKTk9PSnjTpe6YbO6W/0LTYZ1VskL09oU=
|
||||||
src.techknowlogick.com/xormigrate v1.2.0 h1:bq9JaI48bxB+OddMghicjmV7sGmBUogJq4HmTN0DOcw=
|
|
||||||
src.techknowlogick.com/xormigrate v1.2.0/go.mod h1:7so27LAfBRqAxbma5jKYeL4ykVG1Jhsv9ncSq1KBCs4=
|
|
||||||
src.techknowlogick.com/xormigrate v1.2.1 h1:HMtGqV5QN5zvYU244jzFCJ27rAljkMn/jsgp+H4S6WA=
|
src.techknowlogick.com/xormigrate v1.2.1 h1:HMtGqV5QN5zvYU244jzFCJ27rAljkMn/jsgp+H4S6WA=
|
||||||
src.techknowlogick.com/xormigrate v1.2.1/go.mod h1:PhU3iInlbFSev3M4ZnmAeWy9ZHUVDbz3U1X9Sg9S8xQ=
|
src.techknowlogick.com/xormigrate v1.2.1/go.mod h1:PhU3iInlbFSev3M4ZnmAeWy9ZHUVDbz3U1X9Sg9S8xQ=
|
||||||
xorm.io/builder v0.3.7 h1:2pETdKRK+2QG4mLX4oODHEhn5Z8j1m8sXa7jfu+/SZI=
|
xorm.io/builder v0.3.7 h1:2pETdKRK+2QG4mLX4oODHEhn5Z8j1m8sXa7jfu+/SZI=
|
||||||
|
|
5
vendor/github.com/go-openapi/spec/.golangci.yml
generated
vendored
5
vendor/github.com/go-openapi/spec/.golangci.yml
generated
vendored
|
@ -21,3 +21,8 @@ linters:
|
||||||
- lll
|
- lll
|
||||||
- gochecknoinits
|
- gochecknoinits
|
||||||
- gochecknoglobals
|
- gochecknoglobals
|
||||||
|
- funlen
|
||||||
|
- godox
|
||||||
|
- gocognit
|
||||||
|
- whitespace
|
||||||
|
- wsl
|
||||||
|
|
6
vendor/github.com/go-openapi/spec/.travis.yml
generated
vendored
6
vendor/github.com/go-openapi/spec/.travis.yml
generated
vendored
|
@ -1,12 +1,10 @@
|
||||||
after_success:
|
after_success:
|
||||||
- bash <(curl -s https://codecov.io/bash)
|
- bash <(curl -s https://codecov.io/bash)
|
||||||
go:
|
go:
|
||||||
- 1.11.x
|
- 1.13.x
|
||||||
- 1.12.x
|
- 1.14.x
|
||||||
install:
|
install:
|
||||||
- GO111MODULE=off go get -u gotest.tools/gotestsum
|
- GO111MODULE=off go get -u gotest.tools/gotestsum
|
||||||
env:
|
|
||||||
- GO111MODULE=on
|
|
||||||
language: go
|
language: go
|
||||||
notifications:
|
notifications:
|
||||||
slack:
|
slack:
|
||||||
|
|
30
vendor/github.com/go-openapi/spec/contact_info.go
generated
vendored
30
vendor/github.com/go-openapi/spec/contact_info.go
generated
vendored
|
@ -14,11 +14,41 @@
|
||||||
|
|
||||||
package spec
|
package spec
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
|
||||||
|
"github.com/go-openapi/swag"
|
||||||
|
)
|
||||||
|
|
||||||
// ContactInfo contact information for the exposed API.
|
// ContactInfo contact information for the exposed API.
|
||||||
//
|
//
|
||||||
// For more information: http://goo.gl/8us55a#contactObject
|
// For more information: http://goo.gl/8us55a#contactObject
|
||||||
type ContactInfo struct {
|
type ContactInfo struct {
|
||||||
|
ContactInfoProps
|
||||||
|
VendorExtensible
|
||||||
|
}
|
||||||
|
|
||||||
|
type ContactInfoProps struct {
|
||||||
Name string `json:"name,omitempty"`
|
Name string `json:"name,omitempty"`
|
||||||
URL string `json:"url,omitempty"`
|
URL string `json:"url,omitempty"`
|
||||||
Email string `json:"email,omitempty"`
|
Email string `json:"email,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *ContactInfo) UnmarshalJSON(data []byte) error {
|
||||||
|
if err := json.Unmarshal(data, &c.ContactInfoProps); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return json.Unmarshal(data, &c.VendorExtensible)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c ContactInfo) MarshalJSON() ([]byte, error) {
|
||||||
|
b1, err := json.Marshal(c.ContactInfoProps)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
b2, err := json.Marshal(c.VendorExtensible)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return swag.ConcatJSON(b1, b2), nil
|
||||||
|
}
|
||||||
|
|
9
vendor/github.com/go-openapi/spec/expander.go
generated
vendored
9
vendor/github.com/go-openapi/spec/expander.go
generated
vendored
|
@ -200,11 +200,11 @@ func ExpandSpec(spec *Swagger, options *ExpandOptions) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const rootBase = "root"
|
||||||
// baseForRoot loads in the cache the root document and produces a fake "root" base path entry
|
// baseForRoot loads in the cache the root document and produces a fake "root" base path entry
|
||||||
// for further $ref resolution
|
// for further $ref resolution
|
||||||
func baseForRoot(root interface{}, cache ResolutionCache) string {
|
func baseForRoot(root interface{}, cache ResolutionCache) string {
|
||||||
// cache the root document to resolve $ref's
|
// cache the root document to resolve $ref's
|
||||||
const rootBase = "root"
|
|
||||||
if root != nil {
|
if root != nil {
|
||||||
base, _ := absPath(rootBase)
|
base, _ := absPath(rootBase)
|
||||||
normalizedBase := normalizeAbsPath(base)
|
normalizedBase := normalizeAbsPath(base)
|
||||||
|
@ -452,11 +452,12 @@ func expandPathItem(pathItem *PathItem, resolver *schemaLoader, basePath string)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if pathItem.Ref.String() != "" {
|
if pathItem.Ref.String() != "" {
|
||||||
var err error
|
transitiveResolver, err := resolver.transitiveResolver(basePath, pathItem.Ref)
|
||||||
resolver, err = resolver.transitiveResolver(basePath, pathItem.Ref)
|
if transitiveResolver.shouldStopOnError(err) {
|
||||||
if resolver.shouldStopOnError(err) {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
basePath = transitiveResolver.updateBasePath(resolver, basePath)
|
||||||
|
resolver = transitiveResolver
|
||||||
}
|
}
|
||||||
pathItem.Ref = Ref{}
|
pathItem.Ref = Ref{}
|
||||||
|
|
||||||
|
|
7
vendor/github.com/go-openapi/spec/go.mod
generated
vendored
7
vendor/github.com/go-openapi/spec/go.mod
generated
vendored
|
@ -4,14 +4,9 @@ require (
|
||||||
github.com/go-openapi/jsonpointer v0.19.3
|
github.com/go-openapi/jsonpointer v0.19.3
|
||||||
github.com/go-openapi/jsonreference v0.19.2
|
github.com/go-openapi/jsonreference v0.19.2
|
||||||
github.com/go-openapi/swag v0.19.5
|
github.com/go-openapi/swag v0.19.5
|
||||||
github.com/kr/pty v1.1.5 // indirect
|
|
||||||
github.com/stretchr/objx v0.2.0 // indirect
|
|
||||||
github.com/stretchr/testify v1.3.0
|
github.com/stretchr/testify v1.3.0
|
||||||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 // indirect
|
|
||||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // indirect
|
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // indirect
|
||||||
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f // indirect
|
gopkg.in/yaml.v2 v2.2.4
|
||||||
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59 // indirect
|
|
||||||
gopkg.in/yaml.v2 v2.2.2
|
|
||||||
)
|
)
|
||||||
|
|
||||||
go 1.13
|
go 1.13
|
||||||
|
|
29
vendor/github.com/go-openapi/spec/go.sum
generated
vendored
29
vendor/github.com/go-openapi/spec/go.sum
generated
vendored
|
@ -1,5 +1,3 @@
|
||||||
github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4=
|
|
||||||
github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
|
||||||
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
|
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
|
||||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
||||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
|
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
|
||||||
|
@ -7,20 +5,12 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/go-openapi/jsonpointer v0.17.0 h1:nH6xp8XdXHx8dqveo0ZuJBluCO2qGrPbDNZ0dwoRHP0=
|
|
||||||
github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
|
|
||||||
github.com/go-openapi/jsonpointer v0.19.0 h1:FTUMcX77w5rQkClIzDtTxvn6Bsa894CcrzNj2MMfeg8=
|
|
||||||
github.com/go-openapi/jsonpointer v0.19.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
|
|
||||||
github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0=
|
github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0=
|
||||||
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
|
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
|
||||||
github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w=
|
github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w=
|
||||||
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
||||||
github.com/go-openapi/jsonreference v0.19.0 h1:BqWKpV1dFd+AuiKlgtddwVIFQsuMpxfBDBHGfM2yNpk=
|
|
||||||
github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
|
|
||||||
github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w=
|
github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w=
|
||||||
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
|
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
|
||||||
github.com/go-openapi/swag v0.17.0 h1:iqrgMg7Q7SvtbWLlltPrkMs0UBJI6oTSs79JFRUi880=
|
|
||||||
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
|
|
||||||
github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE=
|
github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE=
|
||||||
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
||||||
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
|
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
|
||||||
|
@ -28,11 +18,8 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh
|
||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
|
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic=
|
|
||||||
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
|
||||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4=
|
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4=
|
||||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8=
|
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8=
|
||||||
|
@ -40,35 +27,23 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
|
||||||
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
|
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
|
||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
|
||||||
golang.org/x/net v0.0.0-20181005035420-146acd28ed58 h1:otZG8yDCO4LVps5+9bxOeNiCvgmOyt96J3roHTYs7oE=
|
|
||||||
golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU=
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU=
|
||||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
|
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
|
||||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
|
|
||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
|
||||||
|
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
|
30
vendor/github.com/go-openapi/spec/license.go
generated
vendored
30
vendor/github.com/go-openapi/spec/license.go
generated
vendored
|
@ -14,10 +14,40 @@
|
||||||
|
|
||||||
package spec
|
package spec
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
|
||||||
|
"github.com/go-openapi/swag"
|
||||||
|
)
|
||||||
|
|
||||||
// License information for the exposed API.
|
// License information for the exposed API.
|
||||||
//
|
//
|
||||||
// For more information: http://goo.gl/8us55a#licenseObject
|
// For more information: http://goo.gl/8us55a#licenseObject
|
||||||
type License struct {
|
type License struct {
|
||||||
|
LicenseProps
|
||||||
|
VendorExtensible
|
||||||
|
}
|
||||||
|
|
||||||
|
type LicenseProps struct {
|
||||||
Name string `json:"name,omitempty"`
|
Name string `json:"name,omitempty"`
|
||||||
URL string `json:"url,omitempty"`
|
URL string `json:"url,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l *License) UnmarshalJSON(data []byte) error {
|
||||||
|
if err := json.Unmarshal(data, &l.LicenseProps); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return json.Unmarshal(data, &l.VendorExtensible)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l License) MarshalJSON() ([]byte, error) {
|
||||||
|
b1, err := json.Marshal(l.LicenseProps)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
b2, err := json.Marshal(l.VendorExtensible)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return swag.ConcatJSON(b1, b2), nil
|
||||||
|
}
|
||||||
|
|
1
vendor/github.com/go-openapi/spec/ref.go
generated
vendored
1
vendor/github.com/go-openapi/spec/ref.go
generated
vendored
|
@ -68,6 +68,7 @@ func (r *Ref) IsValidURI(basepaths ...string) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
if r.HasFullURL {
|
if r.HasFullURL {
|
||||||
|
//#nosec
|
||||||
rr, err := http.Get(v)
|
rr, err := http.Get(v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
|
|
17
vendor/github.com/go-openapi/spec/schema_loader.go
generated
vendored
17
vendor/github.com/go-openapi/spec/schema_loader.go
generated
vendored
|
@ -86,12 +86,7 @@ func (r *schemaLoader) transitiveResolver(basePath string, ref Ref) (*schemaLoad
|
||||||
newOptions := r.options
|
newOptions := r.options
|
||||||
newOptions.RelativeBase = rootURL.String()
|
newOptions.RelativeBase = rootURL.String()
|
||||||
debugLog("setting new root: %s", newOptions.RelativeBase)
|
debugLog("setting new root: %s", newOptions.RelativeBase)
|
||||||
resolver, err := defaultSchemaLoader(root, newOptions, r.cache, r.context)
|
return defaultSchemaLoader(root, newOptions, r.cache, r.context)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return resolver, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *schemaLoader) updateBasePath(transitive *schemaLoader, basePath string) string {
|
func (r *schemaLoader) updateBasePath(transitive *schemaLoader, basePath string) string {
|
||||||
|
@ -154,7 +149,15 @@ func (r *schemaLoader) load(refURL *url.URL) (interface{}, url.URL, bool, error)
|
||||||
toFetch := *refURL
|
toFetch := *refURL
|
||||||
toFetch.Fragment = ""
|
toFetch.Fragment = ""
|
||||||
|
|
||||||
normalized := normalizeAbsPath(toFetch.String())
|
var err error
|
||||||
|
path := toFetch.String()
|
||||||
|
if path == rootBase {
|
||||||
|
path, err = absPath(rootBase)
|
||||||
|
if err != nil {
|
||||||
|
return nil, url.URL{}, false, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
normalized := normalizeAbsPath(path)
|
||||||
|
|
||||||
data, fromCache := r.cache.Get(normalized)
|
data, fromCache := r.cache.Get(normalized)
|
||||||
if !fromCache {
|
if !fromCache {
|
||||||
|
|
6
vendor/github.com/go-openapi/swag/.travis.yml
generated
vendored
6
vendor/github.com/go-openapi/swag/.travis.yml
generated
vendored
|
@ -1,12 +1,10 @@
|
||||||
after_success:
|
after_success:
|
||||||
- bash <(curl -s https://codecov.io/bash)
|
- bash <(curl -s https://codecov.io/bash)
|
||||||
go:
|
go:
|
||||||
- 1.11.x
|
- 1.13.x
|
||||||
- 1.12.x
|
- 1.14.x
|
||||||
install:
|
install:
|
||||||
- GO111MODULE=off go get -u gotest.tools/gotestsum
|
- GO111MODULE=off go get -u gotest.tools/gotestsum
|
||||||
env:
|
|
||||||
- GO111MODULE=on
|
|
||||||
language: go
|
language: go
|
||||||
notifications:
|
notifications:
|
||||||
slack:
|
slack:
|
||||||
|
|
16
vendor/github.com/go-openapi/swag/convert.go
generated
vendored
16
vendor/github.com/go-openapi/swag/convert.go
generated
vendored
|
@ -88,7 +88,7 @@ func ConvertFloat64(str string) (float64, error) {
|
||||||
return strconv.ParseFloat(str, 64)
|
return strconv.ParseFloat(str, 64)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConvertInt8 turn a string into int8 boolean
|
// ConvertInt8 turn a string into an int8
|
||||||
func ConvertInt8(str string) (int8, error) {
|
func ConvertInt8(str string) (int8, error) {
|
||||||
i, err := strconv.ParseInt(str, 10, 8)
|
i, err := strconv.ParseInt(str, 10, 8)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -97,7 +97,7 @@ func ConvertInt8(str string) (int8, error) {
|
||||||
return int8(i), nil
|
return int8(i), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConvertInt16 turn a string into a int16
|
// ConvertInt16 turn a string into an int16
|
||||||
func ConvertInt16(str string) (int16, error) {
|
func ConvertInt16(str string) (int16, error) {
|
||||||
i, err := strconv.ParseInt(str, 10, 16)
|
i, err := strconv.ParseInt(str, 10, 16)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -106,7 +106,7 @@ func ConvertInt16(str string) (int16, error) {
|
||||||
return int16(i), nil
|
return int16(i), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConvertInt32 turn a string into a int32
|
// ConvertInt32 turn a string into an int32
|
||||||
func ConvertInt32(str string) (int32, error) {
|
func ConvertInt32(str string) (int32, error) {
|
||||||
i, err := strconv.ParseInt(str, 10, 32)
|
i, err := strconv.ParseInt(str, 10, 32)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -115,12 +115,12 @@ func ConvertInt32(str string) (int32, error) {
|
||||||
return int32(i), nil
|
return int32(i), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConvertInt64 turn a string into a int64
|
// ConvertInt64 turn a string into an int64
|
||||||
func ConvertInt64(str string) (int64, error) {
|
func ConvertInt64(str string) (int64, error) {
|
||||||
return strconv.ParseInt(str, 10, 64)
|
return strconv.ParseInt(str, 10, 64)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConvertUint8 turn a string into a uint8
|
// ConvertUint8 turn a string into an uint8
|
||||||
func ConvertUint8(str string) (uint8, error) {
|
func ConvertUint8(str string) (uint8, error) {
|
||||||
i, err := strconv.ParseUint(str, 10, 8)
|
i, err := strconv.ParseUint(str, 10, 8)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -129,7 +129,7 @@ func ConvertUint8(str string) (uint8, error) {
|
||||||
return uint8(i), nil
|
return uint8(i), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConvertUint16 turn a string into a uint16
|
// ConvertUint16 turn a string into an uint16
|
||||||
func ConvertUint16(str string) (uint16, error) {
|
func ConvertUint16(str string) (uint16, error) {
|
||||||
i, err := strconv.ParseUint(str, 10, 16)
|
i, err := strconv.ParseUint(str, 10, 16)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -138,7 +138,7 @@ func ConvertUint16(str string) (uint16, error) {
|
||||||
return uint16(i), nil
|
return uint16(i), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConvertUint32 turn a string into a uint32
|
// ConvertUint32 turn a string into an uint32
|
||||||
func ConvertUint32(str string) (uint32, error) {
|
func ConvertUint32(str string) (uint32, error) {
|
||||||
i, err := strconv.ParseUint(str, 10, 32)
|
i, err := strconv.ParseUint(str, 10, 32)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -147,7 +147,7 @@ func ConvertUint32(str string) (uint32, error) {
|
||||||
return uint32(i), nil
|
return uint32(i), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConvertUint64 turn a string into a uint64
|
// ConvertUint64 turn a string into an uint64
|
||||||
func ConvertUint64(str string) (uint64, error) {
|
func ConvertUint64(str string) (uint64, error) {
|
||||||
return strconv.ParseUint(str, 10, 64)
|
return strconv.ParseUint(str, 10, 64)
|
||||||
}
|
}
|
||||||
|
|
195
vendor/github.com/go-openapi/swag/convert_types.go
generated
vendored
195
vendor/github.com/go-openapi/swag/convert_types.go
generated
vendored
|
@ -181,12 +181,12 @@ func IntValueMap(src map[string]*int) map[string]int {
|
||||||
return dst
|
return dst
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int32 returns a pointer to of the int64 value passed in.
|
// Int32 returns a pointer to of the int32 value passed in.
|
||||||
func Int32(v int32) *int32 {
|
func Int32(v int32) *int32 {
|
||||||
return &v
|
return &v
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int32Value returns the value of the int64 pointer passed in or
|
// Int32Value returns the value of the int32 pointer passed in or
|
||||||
// 0 if the pointer is nil.
|
// 0 if the pointer is nil.
|
||||||
func Int32Value(v *int32) int32 {
|
func Int32Value(v *int32) int32 {
|
||||||
if v != nil {
|
if v != nil {
|
||||||
|
@ -195,7 +195,7 @@ func Int32Value(v *int32) int32 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int32Slice converts a slice of int64 values into a slice of
|
// Int32Slice converts a slice of int32 values into a slice of
|
||||||
// int32 pointers
|
// int32 pointers
|
||||||
func Int32Slice(src []int32) []*int32 {
|
func Int32Slice(src []int32) []*int32 {
|
||||||
dst := make([]*int32, len(src))
|
dst := make([]*int32, len(src))
|
||||||
|
@ -299,13 +299,80 @@ func Int64ValueMap(src map[string]*int64) map[string]int64 {
|
||||||
return dst
|
return dst
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint returns a pouinter to of the uint value passed in.
|
// Uint16 returns a pointer to of the uint16 value passed in.
|
||||||
|
func Uint16(v uint16) *uint16 {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint16Value returns the value of the uint16 pointer passed in or
|
||||||
|
// 0 if the pointer is nil.
|
||||||
|
func Uint16Value(v *uint16) uint16 {
|
||||||
|
if v != nil {
|
||||||
|
return *v
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint16Slice converts a slice of uint16 values into a slice of
|
||||||
|
// uint16 pointers
|
||||||
|
func Uint16Slice(src []uint16) []*uint16 {
|
||||||
|
dst := make([]*uint16, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
dst[i] = &(src[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint16ValueSlice converts a slice of uint16 pointers into a slice of
|
||||||
|
// uint16 values
|
||||||
|
func Uint16ValueSlice(src []*uint16) []uint16 {
|
||||||
|
dst := make([]uint16, len(src))
|
||||||
|
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
if src[i] != nil {
|
||||||
|
dst[i] = *(src[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint16Map converts a string map of uint16 values into a string
|
||||||
|
// map of uint16 pointers
|
||||||
|
func Uint16Map(src map[string]uint16) map[string]*uint16 {
|
||||||
|
dst := make(map[string]*uint16)
|
||||||
|
|
||||||
|
for k, val := range src {
|
||||||
|
v := val
|
||||||
|
dst[k] = &v
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint16ValueMap converts a string map of uint16 pointers into a string
|
||||||
|
// map of uint16 values
|
||||||
|
func Uint16ValueMap(src map[string]*uint16) map[string]uint16 {
|
||||||
|
dst := make(map[string]uint16)
|
||||||
|
|
||||||
|
for k, val := range src {
|
||||||
|
if val != nil {
|
||||||
|
dst[k] = *val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint returns a pointer to of the uint value passed in.
|
||||||
func Uint(v uint) *uint {
|
func Uint(v uint) *uint {
|
||||||
return &v
|
return &v
|
||||||
}
|
}
|
||||||
|
|
||||||
// UintValue returns the value of the uint pouinter passed in or
|
// UintValue returns the value of the uint pointer passed in or
|
||||||
// 0 if the pouinter is nil.
|
// 0 if the pointer is nil.
|
||||||
func UintValue(v *uint) uint {
|
func UintValue(v *uint) uint {
|
||||||
if v != nil {
|
if v != nil {
|
||||||
return *v
|
return *v
|
||||||
|
@ -313,8 +380,8 @@ func UintValue(v *uint) uint {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// UintSlice converts a slice of uint values uinto a slice of
|
// UintSlice converts a slice of uint values into a slice of
|
||||||
// uint pouinters
|
// uint pointers
|
||||||
func UintSlice(src []uint) []*uint {
|
func UintSlice(src []uint) []*uint {
|
||||||
dst := make([]*uint, len(src))
|
dst := make([]*uint, len(src))
|
||||||
for i := 0; i < len(src); i++ {
|
for i := 0; i < len(src); i++ {
|
||||||
|
@ -323,7 +390,7 @@ func UintSlice(src []uint) []*uint {
|
||||||
return dst
|
return dst
|
||||||
}
|
}
|
||||||
|
|
||||||
// UintValueSlice converts a slice of uint pouinters uinto a slice of
|
// UintValueSlice converts a slice of uint pointers into a slice of
|
||||||
// uint values
|
// uint values
|
||||||
func UintValueSlice(src []*uint) []uint {
|
func UintValueSlice(src []*uint) []uint {
|
||||||
dst := make([]uint, len(src))
|
dst := make([]uint, len(src))
|
||||||
|
@ -335,8 +402,8 @@ func UintValueSlice(src []*uint) []uint {
|
||||||
return dst
|
return dst
|
||||||
}
|
}
|
||||||
|
|
||||||
// UintMap converts a string map of uint values uinto a string
|
// UintMap converts a string map of uint values into a string
|
||||||
// map of uint pouinters
|
// map of uint pointers
|
||||||
func UintMap(src map[string]uint) map[string]*uint {
|
func UintMap(src map[string]uint) map[string]*uint {
|
||||||
dst := make(map[string]*uint)
|
dst := make(map[string]*uint)
|
||||||
for k, val := range src {
|
for k, val := range src {
|
||||||
|
@ -346,7 +413,7 @@ func UintMap(src map[string]uint) map[string]*uint {
|
||||||
return dst
|
return dst
|
||||||
}
|
}
|
||||||
|
|
||||||
// UintValueMap converts a string map of uint pouinters uinto a string
|
// UintValueMap converts a string map of uint pointers into a string
|
||||||
// map of uint values
|
// map of uint values
|
||||||
func UintValueMap(src map[string]*uint) map[string]uint {
|
func UintValueMap(src map[string]*uint) map[string]uint {
|
||||||
dst := make(map[string]uint)
|
dst := make(map[string]uint)
|
||||||
|
@ -358,13 +425,13 @@ func UintValueMap(src map[string]*uint) map[string]uint {
|
||||||
return dst
|
return dst
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint32 returns a pouinter to of the uint64 value passed in.
|
// Uint32 returns a pointer to of the uint32 value passed in.
|
||||||
func Uint32(v uint32) *uint32 {
|
func Uint32(v uint32) *uint32 {
|
||||||
return &v
|
return &v
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint32Value returns the value of the uint64 pouinter passed in or
|
// Uint32Value returns the value of the uint32 pointer passed in or
|
||||||
// 0 if the pouinter is nil.
|
// 0 if the pointer is nil.
|
||||||
func Uint32Value(v *uint32) uint32 {
|
func Uint32Value(v *uint32) uint32 {
|
||||||
if v != nil {
|
if v != nil {
|
||||||
return *v
|
return *v
|
||||||
|
@ -372,8 +439,8 @@ func Uint32Value(v *uint32) uint32 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint32Slice converts a slice of uint64 values uinto a slice of
|
// Uint32Slice converts a slice of uint32 values into a slice of
|
||||||
// uint32 pouinters
|
// uint32 pointers
|
||||||
func Uint32Slice(src []uint32) []*uint32 {
|
func Uint32Slice(src []uint32) []*uint32 {
|
||||||
dst := make([]*uint32, len(src))
|
dst := make([]*uint32, len(src))
|
||||||
for i := 0; i < len(src); i++ {
|
for i := 0; i < len(src); i++ {
|
||||||
|
@ -382,7 +449,7 @@ func Uint32Slice(src []uint32) []*uint32 {
|
||||||
return dst
|
return dst
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint32ValueSlice converts a slice of uint32 pouinters uinto a slice of
|
// Uint32ValueSlice converts a slice of uint32 pointers into a slice of
|
||||||
// uint32 values
|
// uint32 values
|
||||||
func Uint32ValueSlice(src []*uint32) []uint32 {
|
func Uint32ValueSlice(src []*uint32) []uint32 {
|
||||||
dst := make([]uint32, len(src))
|
dst := make([]uint32, len(src))
|
||||||
|
@ -394,8 +461,8 @@ func Uint32ValueSlice(src []*uint32) []uint32 {
|
||||||
return dst
|
return dst
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint32Map converts a string map of uint32 values uinto a string
|
// Uint32Map converts a string map of uint32 values into a string
|
||||||
// map of uint32 pouinters
|
// map of uint32 pointers
|
||||||
func Uint32Map(src map[string]uint32) map[string]*uint32 {
|
func Uint32Map(src map[string]uint32) map[string]*uint32 {
|
||||||
dst := make(map[string]*uint32)
|
dst := make(map[string]*uint32)
|
||||||
for k, val := range src {
|
for k, val := range src {
|
||||||
|
@ -405,7 +472,7 @@ func Uint32Map(src map[string]uint32) map[string]*uint32 {
|
||||||
return dst
|
return dst
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint32ValueMap converts a string map of uint32 pouinters uinto a string
|
// Uint32ValueMap converts a string map of uint32 pointers into a string
|
||||||
// map of uint32 values
|
// map of uint32 values
|
||||||
func Uint32ValueMap(src map[string]*uint32) map[string]uint32 {
|
func Uint32ValueMap(src map[string]*uint32) map[string]uint32 {
|
||||||
dst := make(map[string]uint32)
|
dst := make(map[string]uint32)
|
||||||
|
@ -417,13 +484,13 @@ func Uint32ValueMap(src map[string]*uint32) map[string]uint32 {
|
||||||
return dst
|
return dst
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint64 returns a pouinter to of the uint64 value passed in.
|
// Uint64 returns a pointer to of the uint64 value passed in.
|
||||||
func Uint64(v uint64) *uint64 {
|
func Uint64(v uint64) *uint64 {
|
||||||
return &v
|
return &v
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint64Value returns the value of the uint64 pouinter passed in or
|
// Uint64Value returns the value of the uint64 pointer passed in or
|
||||||
// 0 if the pouinter is nil.
|
// 0 if the pointer is nil.
|
||||||
func Uint64Value(v *uint64) uint64 {
|
func Uint64Value(v *uint64) uint64 {
|
||||||
if v != nil {
|
if v != nil {
|
||||||
return *v
|
return *v
|
||||||
|
@ -431,8 +498,8 @@ func Uint64Value(v *uint64) uint64 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint64Slice converts a slice of uint64 values uinto a slice of
|
// Uint64Slice converts a slice of uint64 values into a slice of
|
||||||
// uint64 pouinters
|
// uint64 pointers
|
||||||
func Uint64Slice(src []uint64) []*uint64 {
|
func Uint64Slice(src []uint64) []*uint64 {
|
||||||
dst := make([]*uint64, len(src))
|
dst := make([]*uint64, len(src))
|
||||||
for i := 0; i < len(src); i++ {
|
for i := 0; i < len(src); i++ {
|
||||||
|
@ -441,7 +508,7 @@ func Uint64Slice(src []uint64) []*uint64 {
|
||||||
return dst
|
return dst
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint64ValueSlice converts a slice of uint64 pouinters uinto a slice of
|
// Uint64ValueSlice converts a slice of uint64 pointers into a slice of
|
||||||
// uint64 values
|
// uint64 values
|
||||||
func Uint64ValueSlice(src []*uint64) []uint64 {
|
func Uint64ValueSlice(src []*uint64) []uint64 {
|
||||||
dst := make([]uint64, len(src))
|
dst := make([]uint64, len(src))
|
||||||
|
@ -453,8 +520,8 @@ func Uint64ValueSlice(src []*uint64) []uint64 {
|
||||||
return dst
|
return dst
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint64Map converts a string map of uint64 values uinto a string
|
// Uint64Map converts a string map of uint64 values into a string
|
||||||
// map of uint64 pouinters
|
// map of uint64 pointers
|
||||||
func Uint64Map(src map[string]uint64) map[string]*uint64 {
|
func Uint64Map(src map[string]uint64) map[string]*uint64 {
|
||||||
dst := make(map[string]*uint64)
|
dst := make(map[string]*uint64)
|
||||||
for k, val := range src {
|
for k, val := range src {
|
||||||
|
@ -464,7 +531,7 @@ func Uint64Map(src map[string]uint64) map[string]*uint64 {
|
||||||
return dst
|
return dst
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint64ValueMap converts a string map of uint64 pouinters uinto a string
|
// Uint64ValueMap converts a string map of uint64 pointers into a string
|
||||||
// map of uint64 values
|
// map of uint64 values
|
||||||
func Uint64ValueMap(src map[string]*uint64) map[string]uint64 {
|
func Uint64ValueMap(src map[string]*uint64) map[string]uint64 {
|
||||||
dst := make(map[string]uint64)
|
dst := make(map[string]uint64)
|
||||||
|
@ -476,6 +543,74 @@ func Uint64ValueMap(src map[string]*uint64) map[string]uint64 {
|
||||||
return dst
|
return dst
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Float32 returns a pointer to of the float32 value passed in.
|
||||||
|
func Float32(v float32) *float32 {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float32Value returns the value of the float32 pointer passed in or
|
||||||
|
// 0 if the pointer is nil.
|
||||||
|
func Float32Value(v *float32) float32 {
|
||||||
|
if v != nil {
|
||||||
|
return *v
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float32Slice converts a slice of float32 values into a slice of
|
||||||
|
// float32 pointers
|
||||||
|
func Float32Slice(src []float32) []*float32 {
|
||||||
|
dst := make([]*float32, len(src))
|
||||||
|
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
dst[i] = &(src[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float32ValueSlice converts a slice of float32 pointers into a slice of
|
||||||
|
// float32 values
|
||||||
|
func Float32ValueSlice(src []*float32) []float32 {
|
||||||
|
dst := make([]float32, len(src))
|
||||||
|
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
if src[i] != nil {
|
||||||
|
dst[i] = *(src[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float32Map converts a string map of float32 values into a string
|
||||||
|
// map of float32 pointers
|
||||||
|
func Float32Map(src map[string]float32) map[string]*float32 {
|
||||||
|
dst := make(map[string]*float32)
|
||||||
|
|
||||||
|
for k, val := range src {
|
||||||
|
v := val
|
||||||
|
dst[k] = &v
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float32ValueMap converts a string map of float32 pointers into a string
|
||||||
|
// map of float32 values
|
||||||
|
func Float32ValueMap(src map[string]*float32) map[string]float32 {
|
||||||
|
dst := make(map[string]float32)
|
||||||
|
|
||||||
|
for k, val := range src {
|
||||||
|
if val != nil {
|
||||||
|
dst[k] = *val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
// Float64 returns a pointer to of the float64 value passed in.
|
// Float64 returns a pointer to of the float64 value passed in.
|
||||||
func Float64(v float64) *float64 {
|
func Float64(v float64) *float64 {
|
||||||
return &v
|
return &v
|
||||||
|
|
4
vendor/github.com/go-openapi/swag/go.mod
generated
vendored
4
vendor/github.com/go-openapi/swag/go.mod
generated
vendored
|
@ -6,9 +6,11 @@ require (
|
||||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63
|
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63
|
||||||
github.com/stretchr/testify v1.3.0
|
github.com/stretchr/testify v1.3.0
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
|
||||||
gopkg.in/yaml.v2 v2.2.2
|
gopkg.in/yaml.v2 v2.2.4
|
||||||
)
|
)
|
||||||
|
|
||||||
replace github.com/golang/lint => golang.org/x/lint v0.0.0-20190409202823-959b441ac422
|
replace github.com/golang/lint => golang.org/x/lint v0.0.0-20190409202823-959b441ac422
|
||||||
|
|
||||||
replace sourcegraph.com/sourcegraph/go-diff => github.com/sourcegraph/go-diff v0.5.1
|
replace sourcegraph.com/sourcegraph/go-diff => github.com/sourcegraph/go-diff v0.5.1
|
||||||
|
|
||||||
|
go 1.13
|
||||||
|
|
4
vendor/github.com/go-openapi/swag/go.sum
generated
vendored
4
vendor/github.com/go-openapi/swag/go.sum
generated
vendored
|
@ -16,5 +16,5 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
|
8
vendor/github.com/go-openapi/swag/json.go
generated
vendored
8
vendor/github.com/go-openapi/swag/json.go
generated
vendored
|
@ -51,7 +51,7 @@ type ejUnmarshaler interface {
|
||||||
UnmarshalEasyJSON(w *jlexer.Lexer)
|
UnmarshalEasyJSON(w *jlexer.Lexer)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WriteJSON writes json data, prefers finding an appropriate interface to short-circuit the marshaller
|
// WriteJSON writes json data, prefers finding an appropriate interface to short-circuit the marshaler
|
||||||
// so it takes the fastest option available.
|
// so it takes the fastest option available.
|
||||||
func WriteJSON(data interface{}) ([]byte, error) {
|
func WriteJSON(data interface{}) ([]byte, error) {
|
||||||
if d, ok := data.(ejMarshaler); ok {
|
if d, ok := data.(ejMarshaler); ok {
|
||||||
|
@ -65,8 +65,8 @@ func WriteJSON(data interface{}) ([]byte, error) {
|
||||||
return json.Marshal(data)
|
return json.Marshal(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaller
|
// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaler
|
||||||
// so it takes the fastes option available
|
// so it takes the fastest option available
|
||||||
func ReadJSON(data []byte, value interface{}) error {
|
func ReadJSON(data []byte, value interface{}) error {
|
||||||
trimmedData := bytes.Trim(data, "\x00")
|
trimmedData := bytes.Trim(data, "\x00")
|
||||||
if d, ok := value.(ejUnmarshaler); ok {
|
if d, ok := value.(ejUnmarshaler); ok {
|
||||||
|
@ -189,7 +189,7 @@ func FromDynamicJSON(data, target interface{}) error {
|
||||||
return json.Unmarshal(b, target)
|
return json.Unmarshal(b, target)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NameProvider represents an object capabale of translating from go property names
|
// NameProvider represents an object capable of translating from go property names
|
||||||
// to json property names
|
// to json property names
|
||||||
// This type is thread-safe.
|
// This type is thread-safe.
|
||||||
type NameProvider struct {
|
type NameProvider struct {
|
||||||
|
|
18
vendor/github.com/go-openapi/swag/loading.go
generated
vendored
18
vendor/github.com/go-openapi/swag/loading.go
generated
vendored
|
@ -27,6 +27,15 @@ import (
|
||||||
// LoadHTTPTimeout the default timeout for load requests
|
// LoadHTTPTimeout the default timeout for load requests
|
||||||
var LoadHTTPTimeout = 30 * time.Second
|
var LoadHTTPTimeout = 30 * time.Second
|
||||||
|
|
||||||
|
// LoadHTTPBasicAuthUsername the username to use when load requests require basic auth
|
||||||
|
var LoadHTTPBasicAuthUsername = ""
|
||||||
|
|
||||||
|
// LoadHTTPBasicAuthPassword the password to use when load requests require basic auth
|
||||||
|
var LoadHTTPBasicAuthPassword = ""
|
||||||
|
|
||||||
|
// LoadHTTPCustomHeaders an optional collection of custom HTTP headers for load requests
|
||||||
|
var LoadHTTPCustomHeaders = map[string]string{}
|
||||||
|
|
||||||
// LoadFromFileOrHTTP loads the bytes from a file or a remote http server based on the path passed in
|
// LoadFromFileOrHTTP loads the bytes from a file or a remote http server based on the path passed in
|
||||||
func LoadFromFileOrHTTP(path string) ([]byte, error) {
|
func LoadFromFileOrHTTP(path string) ([]byte, error) {
|
||||||
return LoadStrategy(path, ioutil.ReadFile, loadHTTPBytes(LoadHTTPTimeout))(path)
|
return LoadStrategy(path, ioutil.ReadFile, loadHTTPBytes(LoadHTTPTimeout))(path)
|
||||||
|
@ -59,6 +68,15 @@ func loadHTTPBytes(timeout time.Duration) func(path string) ([]byte, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if LoadHTTPBasicAuthUsername != "" && LoadHTTPBasicAuthPassword != "" {
|
||||||
|
req.SetBasicAuth(LoadHTTPBasicAuthUsername, LoadHTTPBasicAuthPassword)
|
||||||
|
}
|
||||||
|
|
||||||
|
for key, val := range LoadHTTPCustomHeaders {
|
||||||
|
req.Header.Set(key, val)
|
||||||
|
}
|
||||||
|
|
||||||
resp, err := client.Do(req)
|
resp, err := client.Do(req)
|
||||||
defer func() {
|
defer func() {
|
||||||
if resp != nil {
|
if resp != nil {
|
||||||
|
|
43
vendor/github.com/mailru/easyjson/jwriter/writer.go
generated
vendored
43
vendor/github.com/mailru/easyjson/jwriter/writer.go
generated
vendored
|
@ -270,16 +270,25 @@ func (w *Writer) Bool(v bool) {
|
||||||
|
|
||||||
const chars = "0123456789abcdef"
|
const chars = "0123456789abcdef"
|
||||||
|
|
||||||
func isNotEscapedSingleChar(c byte, escapeHTML bool) bool {
|
func getTable(falseValues ...int) [128]bool {
|
||||||
// Note: might make sense to use a table if there are more chars to escape. With 4 chars
|
table := [128]bool{}
|
||||||
// it benchmarks the same.
|
|
||||||
if escapeHTML {
|
for i := 0; i < 128; i++ {
|
||||||
return c != '<' && c != '>' && c != '&' && c != '\\' && c != '"' && c >= 0x20 && c < utf8.RuneSelf
|
table[i] = true
|
||||||
} else {
|
|
||||||
return c != '\\' && c != '"' && c >= 0x20 && c < utf8.RuneSelf
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, v := range falseValues {
|
||||||
|
table[v] = false
|
||||||
|
}
|
||||||
|
|
||||||
|
return table
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
htmlEscapeTable = getTable(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, '"', '&', '<', '>', '\\')
|
||||||
|
htmlNoEscapeTable = getTable(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, '"', '\\')
|
||||||
|
)
|
||||||
|
|
||||||
func (w *Writer) String(s string) {
|
func (w *Writer) String(s string) {
|
||||||
w.Buffer.AppendByte('"')
|
w.Buffer.AppendByte('"')
|
||||||
|
|
||||||
|
@ -288,15 +297,23 @@ func (w *Writer) String(s string) {
|
||||||
|
|
||||||
p := 0 // last non-escape symbol
|
p := 0 // last non-escape symbol
|
||||||
|
|
||||||
|
var escapeTable [128]bool
|
||||||
|
if w.NoEscapeHTML {
|
||||||
|
escapeTable = htmlNoEscapeTable
|
||||||
|
} else {
|
||||||
|
escapeTable = htmlEscapeTable
|
||||||
|
}
|
||||||
|
|
||||||
for i := 0; i < len(s); {
|
for i := 0; i < len(s); {
|
||||||
c := s[i]
|
c := s[i]
|
||||||
|
|
||||||
if isNotEscapedSingleChar(c, !w.NoEscapeHTML) {
|
if c < utf8.RuneSelf {
|
||||||
// single-width character, no escaping is required
|
if escapeTable[c] {
|
||||||
i++
|
// single-width character, no escaping is required
|
||||||
continue
|
i++
|
||||||
} else if c < utf8.RuneSelf {
|
continue
|
||||||
// single-with character, need to escape
|
}
|
||||||
|
|
||||||
w.Buffer.AppendString(s[p:i])
|
w.Buffer.AppendString(s[p:i])
|
||||||
switch c {
|
switch c {
|
||||||
case '\t':
|
case '\t':
|
||||||
|
|
6
vendor/github.com/swaggo/swag/.travis.yml
generated
vendored
6
vendor/github.com/swaggo/swag/.travis.yml
generated
vendored
|
@ -1,10 +1,8 @@
|
||||||
language: go
|
language: go
|
||||||
sudo: false
|
|
||||||
|
|
||||||
go:
|
go:
|
||||||
- 1.10.x
|
- 1.13.x
|
||||||
- 1.11.x
|
- 1.14.x
|
||||||
- 1.12.x
|
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- make deps
|
- make deps
|
||||||
|
|
29
vendor/github.com/swaggo/swag/Dockerfile
generated
vendored
Normal file
29
vendor/github.com/swaggo/swag/Dockerfile
generated
vendored
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
# Dockerfile References: https://docs.docker.com/engine/reference/builder/
|
||||||
|
|
||||||
|
# Start from the latest golang base image
|
||||||
|
FROM golang:1.14-alpine as builder
|
||||||
|
|
||||||
|
# Set the Current Working Directory inside the container
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy go mod and sum files
|
||||||
|
COPY go.mod go.sum ./
|
||||||
|
|
||||||
|
# Download all dependencies. Dependencies will be cached if the go.mod and go.sum files are not changed
|
||||||
|
RUN go mod download
|
||||||
|
|
||||||
|
# Copy the source from the current directory to the Working Directory inside the container
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# Build the Go app
|
||||||
|
RUN CGO_ENABLED=0 GOOS=linux go build -v -a -installsuffix cgo -o swag cmd/swag/main.go
|
||||||
|
|
||||||
|
|
||||||
|
######## Start a new stage from scratch #######
|
||||||
|
FROM scratch
|
||||||
|
|
||||||
|
WORKDIR /root/
|
||||||
|
|
||||||
|
# Copy the Pre-built binary file from the previous stage
|
||||||
|
COPY --from=builder /app/swag .
|
||||||
|
|
15
vendor/github.com/swaggo/swag/Makefile
generated
vendored
15
vendor/github.com/swaggo/swag/Makefile
generated
vendored
|
@ -9,6 +9,7 @@ GOTEST:=$(GOCMD) test
|
||||||
GOGET:=$(GOCMD) get
|
GOGET:=$(GOCMD) get
|
||||||
GOLIST:=$(GOCMD) list
|
GOLIST:=$(GOCMD) list
|
||||||
GOVET:=$(GOCMD) vet
|
GOVET:=$(GOCMD) vet
|
||||||
|
GOPATH:=$(shell $(GOCMD) env GOPATH)
|
||||||
u := $(if $(update),-u)
|
u := $(if $(update),-u)
|
||||||
|
|
||||||
BINARY_NAME:=swag
|
BINARY_NAME:=swag
|
||||||
|
@ -53,16 +54,20 @@ clean:
|
||||||
|
|
||||||
.PHONY: deps
|
.PHONY: deps
|
||||||
deps:
|
deps:
|
||||||
$(GOGET) ${u} -d
|
$(GOGET) github.com/swaggo/cli
|
||||||
|
$(GOGET) github.com/ghodss/yaml
|
||||||
|
$(GOGET) github.com/gin-gonic/gin
|
||||||
|
$(GOGET) github.com/KyleBanks/depth
|
||||||
|
$(GOGET) github.com/go-openapi/jsonreference
|
||||||
|
$(GOGET) github.com/go-openapi/spec
|
||||||
$(GOGET) github.com/stretchr/testify/assert
|
$(GOGET) github.com/stretchr/testify/assert
|
||||||
$(GOGET) github.com/alecthomas/template
|
$(GOGET) github.com/alecthomas/template
|
||||||
|
$(GOGET) golang.org/x/tools/go/loader
|
||||||
|
|
||||||
.PHONY: devel-deps
|
.PHONY: devel-deps
|
||||||
devel-deps:
|
devel-deps:
|
||||||
GO111MODULE=off $(GOGET) -v -u \
|
GO111MODULE=off $(GOGET) -v -u \
|
||||||
golang.org/x/lint/golint \
|
golang.org/x/lint/golint
|
||||||
github.com/swaggo/swag/cmd/swag \
|
|
||||||
github.com/swaggo/swag/gen
|
|
||||||
|
|
||||||
.PHONY: lint
|
.PHONY: lint
|
||||||
lint: devel-deps
|
lint: devel-deps
|
||||||
|
|
85
vendor/github.com/swaggo/swag/README.md
generated
vendored
85
vendor/github.com/swaggo/swag/README.md
generated
vendored
|
@ -1,5 +1,7 @@
|
||||||
# swag
|
# swag
|
||||||
|
|
||||||
|
🌍 *[English](README.md) ∙ [简体中文](README_zh-CN.md)*
|
||||||
|
|
||||||
<img align="right" width="180px" src="https://raw.githubusercontent.com/swaggo/swag/master/assets/swaggo.png">
|
<img align="right" width="180px" src="https://raw.githubusercontent.com/swaggo/swag/master/assets/swaggo.png">
|
||||||
|
|
||||||
[![Travis Status](https://img.shields.io/travis/swaggo/swag/master.svg)](https://travis-ci.org/swaggo/swag)
|
[![Travis Status](https://img.shields.io/travis/swaggo/swag/master.svg)](https://travis-ci.org/swaggo/swag)
|
||||||
|
@ -26,12 +28,15 @@ Swag converts Go annotations to Swagger Documentation 2.0. We've created a varie
|
||||||
- [Examples](#examples)
|
- [Examples](#examples)
|
||||||
- [Descriptions over multiple lines](#descriptions-over-multiple-lines)
|
- [Descriptions over multiple lines](#descriptions-over-multiple-lines)
|
||||||
- [User defined structure with an array type](#user-defined-structure-with-an-array-type)
|
- [User defined structure with an array type](#user-defined-structure-with-an-array-type)
|
||||||
|
- [Model composition in response](#model-composition-in-response)
|
||||||
- [Add a headers in response](#add-a-headers-in-response)
|
- [Add a headers in response](#add-a-headers-in-response)
|
||||||
- [Use multiple path params](#use-multiple-path-params)
|
- [Use multiple path params](#use-multiple-path-params)
|
||||||
- [Example value of struct](#example-value-of-struct)
|
- [Example value of struct](#example-value-of-struct)
|
||||||
- [Description of struct](#description-of-struct)
|
- [Description of struct](#description-of-struct)
|
||||||
- [Use swaggertype tag to supported custom type](#use-swaggertype-tag-to-supported-custom-type)
|
- [Use swaggertype tag to supported custom type](#use-swaggertype-tag-to-supported-custom-type)
|
||||||
|
- [Use swaggerignore tag to exclude a field](#use-swaggerignore-tag-to-exclude-a-field)
|
||||||
- [Add extension info to struct field](#add-extension-info-to-struct-field)
|
- [Add extension info to struct field](#add-extension-info-to-struct-field)
|
||||||
|
- [Rename model to display](#rename-model-to-display)
|
||||||
- [How to using security annotations](#how-to-using-security-annotations)
|
- [How to using security annotations](#how-to-using-security-annotations)
|
||||||
- [About the Project](#about-the-project)
|
- [About the Project](#about-the-project)
|
||||||
|
|
||||||
|
@ -45,7 +50,7 @@ $ go get -u github.com/swaggo/swag/cmd/swag
|
||||||
```
|
```
|
||||||
To build from source you need [Go](https://golang.org/dl/) (1.9 or newer).
|
To build from source you need [Go](https://golang.org/dl/) (1.9 or newer).
|
||||||
|
|
||||||
Or download the pre-compiled binaries binray form [release page](https://github.com/swaggo/swag/releases).
|
Or download a pre-compiled binary from the [release page](https://github.com/swaggo/swag/releases).
|
||||||
|
|
||||||
3. Run `swag init` in the project's root folder which contains the `main.go` file. This will parse your comments and generate the required files (`docs` folder and `docs/docs.go`).
|
3. Run `swag init` in the project's root folder which contains the `main.go` file. This will parse your comments and generate the required files (`docs` folder and `docs/docs.go`).
|
||||||
```sh
|
```sh
|
||||||
|
@ -70,10 +75,12 @@ USAGE:
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--generalInfo value, -g value Go file path in which 'swagger general API Info' is written (default: "main.go")
|
--generalInfo value, -g value Go file path in which 'swagger general API Info' is written (default: "main.go")
|
||||||
--dir value, -d value Directory you want to parse (default: "./")
|
--dir value, -d value Directory you want to parse (default: "./")
|
||||||
|
--exclude value Exclude directoies and files, comma separated
|
||||||
--propertyStrategy value, -p value Property Naming Strategy like snakecase,camelcase,pascalcase (default: "camelcase")
|
--propertyStrategy value, -p value Property Naming Strategy like snakecase,camelcase,pascalcase (default: "camelcase")
|
||||||
--output value, -o value Output directory for al the generated files(swagger.json, swagger.yaml and doc.go) (default: "./docs")
|
--output value, -o value Output directory for all the generated files(swagger.json, swagger.yaml and doc.go) (default: "./docs")
|
||||||
--parseVendor Parse go files in 'vendor' folder, disabled by default
|
--parseVendor Parse go files in 'vendor' folder, disabled by default
|
||||||
--parseDependency Parse go files in outside dependency folder, disabled by default
|
--parseDependency Parse go files in outside dependency folder, disabled by default
|
||||||
|
--parseInternal Parse go files in internal packages, disabled by default
|
||||||
```
|
```
|
||||||
|
|
||||||
## Supported Web Frameworks
|
## Supported Web Frameworks
|
||||||
|
@ -82,6 +89,8 @@ OPTIONS:
|
||||||
- [echo](http://github.com/swaggo/echo-swagger)
|
- [echo](http://github.com/swaggo/echo-swagger)
|
||||||
- [buffalo](https://github.com/swaggo/buffalo-swagger)
|
- [buffalo](https://github.com/swaggo/buffalo-swagger)
|
||||||
- [net/http](https://github.com/swaggo/http-swagger)
|
- [net/http](https://github.com/swaggo/http-swagger)
|
||||||
|
- [flamingo](https://github.com/i-love-flamingo/swagger)
|
||||||
|
- [fiber](https://github.com/arsmn/fiber-swagger)
|
||||||
|
|
||||||
## How to use it with Gin
|
## How to use it with Gin
|
||||||
|
|
||||||
|
@ -110,6 +119,7 @@ import "github.com/swaggo/files" // swagger embed files
|
||||||
|
|
||||||
// @host localhost:8080
|
// @host localhost:8080
|
||||||
// @BasePath /api/v1
|
// @BasePath /api/v1
|
||||||
|
// @query.collection.format multi
|
||||||
|
|
||||||
// @securityDefinitions.basic BasicAuth
|
// @securityDefinitions.basic BasicAuth
|
||||||
|
|
||||||
|
@ -277,7 +287,7 @@ func (c *Controller) ListAccounts(ctx *gin.Context) {
|
||||||
$ swag init
|
$ swag init
|
||||||
```
|
```
|
||||||
|
|
||||||
4.Run your app, and browse to http://localhost:8080/swagger/index.html. You will see Swagger 2.0 Api documents as shown below:
|
4. Run your app, and browse to http://localhost:8080/swagger/index.html. You will see Swagger 2.0 Api documents as shown below:
|
||||||
|
|
||||||
![swagger_index.html](https://raw.githubusercontent.com/swaggo/swag/master/assets/swagger-image.png)
|
![swagger_index.html](https://raw.githubusercontent.com/swaggo/swag/master/assets/swagger-image.png)
|
||||||
|
|
||||||
|
@ -325,6 +335,7 @@ $ swag init
|
||||||
| license.url | A URL to the license used for the API. MUST be in the format of a URL. | // @license.url http://www.apache.org/licenses/LICENSE-2.0.html |
|
| license.url | A URL to the license used for the API. MUST be in the format of a URL. | // @license.url http://www.apache.org/licenses/LICENSE-2.0.html |
|
||||||
| host | The host (name or ip) serving the API. | // @host localhost:8080 |
|
| host | The host (name or ip) serving the API. | // @host localhost:8080 |
|
||||||
| BasePath | The base path on which the API is served. | // @BasePath /api/v1 |
|
| BasePath | The base path on which the API is served. | // @BasePath /api/v1 |
|
||||||
|
| query.collection.format | The default collection(array) param format in query,enums:csv,multi,pipes,tsv,ssv. If not set, csv is the default.| // @query.collection.format multi
|
||||||
| schemes | The transfer protocol for the operation that separated by spaces. | // @schemes http https |
|
| schemes | The transfer protocol for the operation that separated by spaces. | // @schemes http https |
|
||||||
| x-name | The extension key, must be start by x- and take only json value | // @x-example-key {"key": "value"} |
|
| x-name | The extension key, must be start by x- and take only json value | // @x-example-key {"key": "value"} |
|
||||||
|
|
||||||
|
@ -341,7 +352,6 @@ When a short string in your documentation is insufficient, or you need images, c
|
||||||
| tag.description.markdown | Description of the tag this is an alternative to tag.description. The description will be read from a file named like tagname.md | // @tag.description.markdown |
|
| tag.description.markdown | Description of the tag this is an alternative to tag.description. The description will be read from a file named like tagname.md | // @tag.description.markdown |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## API Operation
|
## API Operation
|
||||||
|
|
||||||
**Example**
|
**Example**
|
||||||
|
@ -351,6 +361,7 @@ When a short string in your documentation is insufficient, or you need images, c
|
||||||
| annotation | description |
|
| annotation | description |
|
||||||
|-------------|----------------------------------------------------------------------------------------------------------------------------|
|
|-------------|----------------------------------------------------------------------------------------------------------------------------|
|
||||||
| description | A verbose explanation of the operation behavior. |
|
| description | A verbose explanation of the operation behavior. |
|
||||||
|
| description.markdown | A short description of the application. The description will be read from a file named like endpointname.md| // @description.file endpoint.description.markdown |
|
||||||
| id | A unique string used to identify the operation. Must be unique among all API operations. |
|
| id | A unique string used to identify the operation. Must be unique among all API operations. |
|
||||||
| tags | A list of tags to each API operation that separated by commas. |
|
| tags | A list of tags to each API operation that separated by commas. |
|
||||||
| summary | A short summary of what the operation does. |
|
| summary | A short summary of what the operation does. |
|
||||||
|
@ -364,6 +375,8 @@ When a short string in your documentation is insufficient, or you need images, c
|
||||||
| router | Path definition that separated by spaces. `path`,`[httpMethod]` |
|
| router | Path definition that separated by spaces. `path`,`[httpMethod]` |
|
||||||
| x-name | The extension key, must be start by x- and take only json value. |
|
| x-name | The extension key, must be start by x- and take only json value. |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Mime Types
|
## Mime Types
|
||||||
|
|
||||||
`swag` accepts all MIME Types which are in the correct format, that is, match `*/*`.
|
`swag` accepts all MIME Types which are in the correct format, that is, match `*/*`.
|
||||||
|
@ -431,6 +444,7 @@ Besides that, `swag` also accepts aliases for some MIME Types as follows:
|
||||||
// @Param string query string false "string valid" minlength(5) maxlength(10)
|
// @Param string query string false "string valid" minlength(5) maxlength(10)
|
||||||
// @Param int query int false "int valid" mininum(1) maxinum(10)
|
// @Param int query int false "int valid" mininum(1) maxinum(10)
|
||||||
// @Param default query string false "string default" default(A)
|
// @Param default query string false "string default" default(A)
|
||||||
|
// @Param collection query []string false "string collection" collectionFormat(multi)
|
||||||
```
|
```
|
||||||
|
|
||||||
It also works for the struct fields:
|
It also works for the struct fields:
|
||||||
|
@ -447,13 +461,15 @@ type Foo struct {
|
||||||
|
|
||||||
Field Name | Type | Description
|
Field Name | Type | Description
|
||||||
---|:---:|---
|
---|:---:|---
|
||||||
|
<a name="validate"></a>validate | `string` | Determines the validation for the parameter. Possible values are: `required`.
|
||||||
<a name="parameterDefault"></a>default | * | Declares the value of the parameter that the server will use if none is provided, for example a "count" to control the number of results per page might default to 100 if not supplied by the client in the request. (Note: "default" has no meaning for required parameters.) See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-6.2. Unlike JSON Schema this value MUST conform to the defined [`type`](#parameterType) for this parameter.
|
<a name="parameterDefault"></a>default | * | Declares the value of the parameter that the server will use if none is provided, for example a "count" to control the number of results per page might default to 100 if not supplied by the client in the request. (Note: "default" has no meaning for required parameters.) See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-6.2. Unlike JSON Schema this value MUST conform to the defined [`type`](#parameterType) for this parameter.
|
||||||
<a name="parameterMaximum"></a>maximum | `number` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.1.2.
|
<a name="parameterMaximum"></a>maximum | `number` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.1.2.
|
||||||
<a name="parameterMinimum"></a>minimum | `number` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.1.3.
|
<a name="parameterMinimum"></a>minimum | `number` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.1.3.
|
||||||
<a name="parameterMaxLength"></a>maxLength | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.1.
|
<a name="parameterMaxLength"></a>maxLength | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.1.
|
||||||
<a name="parameterMinLength"></a>minLength | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.2.
|
<a name="parameterMinLength"></a>minLength | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.2.
|
||||||
<a name="parameterEnums"></a>enums | [\*] | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.5.1.
|
<a name="parameterEnums"></a>enums | [\*] | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.5.1.
|
||||||
<a name="parameterFormat"></a>format | `string` | The extending format for the previously mentioned [`type`](#parameterType). See [Data Type Formats](#dataTypeFormat) for further details.
|
<a name="parameterFormat"></a>format | `string` | The extending format for the previously mentioned [`type`](#parameterType). See [Data Type Formats](https://swagger.io/specification/v2/#dataTypeFormat) for further details.
|
||||||
|
<a name="parameterCollectionFormat"></a>collectionFormat | `string` |Determines the format of the array if type array is used. Possible values are: <ul><li>`csv` - comma separated values `foo,bar`. <li>`ssv` - space separated values `foo bar`. <li>`tsv` - tab separated values `foo\tbar`. <li>`pipes` - pipe separated values <code>foo|bar</code>. <li>`multi` - corresponds to multiple parameter instances instead of multiple values for a single instance `foo=bar&foo=baz`. This is valid only for parameters [`in`](#parameterIn) "query" or "formData". </ul> Default value is `csv`.
|
||||||
|
|
||||||
### Future
|
### Future
|
||||||
|
|
||||||
|
@ -464,7 +480,6 @@ Field Name | Type | Description
|
||||||
<a name="parameterMaxItems"></a>maxItems | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.2.
|
<a name="parameterMaxItems"></a>maxItems | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.2.
|
||||||
<a name="parameterMinItems"></a>minItems | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.3.
|
<a name="parameterMinItems"></a>minItems | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.3.
|
||||||
<a name="parameterUniqueItems"></a>uniqueItems | `boolean` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.4.
|
<a name="parameterUniqueItems"></a>uniqueItems | `boolean` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.4.
|
||||||
<a name="parameterCollectionFormat"></a>collectionFormat | `string` | Determines the format of the array if type array is used. Possible values are: <ul><li>`csv` - comma separated values `foo,bar`. <li>`ssv` - space separated values `foo bar`. <li>`tsv` - tab separated values `foo\tbar`. <li>`pipes` - pipe separated values <code>foo|bar</code>. <li>`multi` - corresponds to multiple parameter instances instead of multiple values for a single instance `foo=bar&foo=baz`. This is valid only for parameters [`in`](#parameterIn) "query" or "formData". </ul> Default value is `csv`.
|
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
|
@ -492,6 +507,44 @@ type Account struct {
|
||||||
Name string `json:"name" example:"account name"`
|
Name string `json:"name" example:"account name"`
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Model composition in response
|
||||||
|
```go
|
||||||
|
// JSONResult's data field will be overridden by the specific type proto.Order
|
||||||
|
@success 200 {object} jsonresult.JSONResult{data=proto.Order} "desc"
|
||||||
|
```
|
||||||
|
|
||||||
|
```go
|
||||||
|
type JSONResult struct {
|
||||||
|
Code int `json:"code" `
|
||||||
|
Message string `json:"message"`
|
||||||
|
Data interface{} `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Order struct { //in `proto` package
|
||||||
|
Id uint `json:"id"`
|
||||||
|
Data interface{} `json:"data"`
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- also support array of objects and primitive types as nested response
|
||||||
|
```go
|
||||||
|
@success 200 {object} jsonresult.JSONResult{data=[]proto.Order} "desc"
|
||||||
|
@success 200 {object} jsonresult.JSONResult{data=string} "desc"
|
||||||
|
@success 200 {object} jsonresult.JSONResult{data=[]string} "desc"
|
||||||
|
```
|
||||||
|
|
||||||
|
- overriding multiple fields. field will be added if not exists
|
||||||
|
```go
|
||||||
|
@success 200 {object} jsonresult.JSONResult{data1=string,data2=[]string,data3=proto.Order,data4=[]proto.Order} "desc"
|
||||||
|
```
|
||||||
|
- overriding deep-level fields
|
||||||
|
```go
|
||||||
|
type DeepObject struct { //in `proto` package
|
||||||
|
...
|
||||||
|
}
|
||||||
|
@success 200 {object} jsonresult.JSONResult{data1=proto.Order{data=proto.DeepObject},data2=[]proto.Order{data=[]proto.DeepObject}} "desc"
|
||||||
|
```
|
||||||
### Add a headers in response
|
### Add a headers in response
|
||||||
|
|
||||||
```go
|
```go
|
||||||
|
@ -594,11 +647,22 @@ generated swagger doc as follows:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Use swaggerignore tag to exclude a field
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Account struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Ignored int `swaggerignore:"true"`
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Add extension info to struct field
|
### Add extension info to struct field
|
||||||
|
|
||||||
```go
|
```go
|
||||||
type Account struct {
|
type Account struct {
|
||||||
ID int `json:"id" extensions:"x-nullable,x-abc=def"` // extensions fields must start with "x-"
|
ID string `json:"id" extensions:"x-nullable,x-abc=def"` // extensions fields must start with "x-"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -616,6 +680,13 @@ generate swagger doc as follows:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
### Rename model to display
|
||||||
|
|
||||||
|
```golang
|
||||||
|
type Resp struct {
|
||||||
|
Code int
|
||||||
|
}//@name Response
|
||||||
|
```
|
||||||
|
|
||||||
### How to using security annotations
|
### How to using security annotations
|
||||||
|
|
||||||
|
|
740
vendor/github.com/swaggo/swag/README_zh-CN.md
generated
vendored
Normal file
740
vendor/github.com/swaggo/swag/README_zh-CN.md
generated
vendored
Normal file
|
@ -0,0 +1,740 @@
|
||||||
|
# swag
|
||||||
|
|
||||||
|
🌍 *[English](README.md) ∙ [简体中文](README_zh-CN.md)*
|
||||||
|
|
||||||
|
<img align="right" width="180px" src="https://raw.githubusercontent.com/swaggo/swag/master/assets/swaggo.png">
|
||||||
|
|
||||||
|
[![Travis Status](https://img.shields.io/travis/swaggo/swag/master.svg)](https://travis-ci.org/swaggo/swag)
|
||||||
|
[![Coverage Status](https://img.shields.io/codecov/c/github/swaggo/swag/master.svg)](https://codecov.io/gh/swaggo/swag)
|
||||||
|
[![Go Report Card](https://goreportcard.com/badge/github.com/swaggo/swag)](https://goreportcard.com/report/github.com/swaggo/swag)
|
||||||
|
[![codebeat badge](https://codebeat.co/badges/71e2f5e5-9e6b-405d-baf9-7cc8b5037330)](https://codebeat.co/projects/github-com-swaggo-swag-master)
|
||||||
|
[![Go Doc](https://godoc.org/github.com/swaggo/swagg?status.svg)](https://godoc.org/github.com/swaggo/swag)
|
||||||
|
[![Backers on Open Collective](https://opencollective.com/swag/backers/badge.svg)](#backers)
|
||||||
|
[![Sponsors on Open Collective](https://opencollective.com/swag/sponsors/badge.svg)](#sponsors) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fswaggo%2Fswag.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fswaggo%2Fswag?ref=badge_shield)
|
||||||
|
[![Release](https://img.shields.io/github/release/swaggo/swag.svg?style=flat-square)](https://github.com/swaggo/swag/releases)
|
||||||
|
|
||||||
|
Swag将Go的注释转换为Swagger2.0文档。我们为流行的 [Go Web Framework](#支持的Web框架) 创建了各种插件,这样可以与现有Go项目快速集成(使用Swagger UI)。
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
|
||||||
|
- [快速开始](#快速开始)
|
||||||
|
- [支持的Web框架](#支持的web框架)
|
||||||
|
- [如何与Gin集成](#如何与gin集成)
|
||||||
|
- [开发现状](#开发现状)
|
||||||
|
- [声明式注释格式](#声明式注释格式)
|
||||||
|
- [通用API信息](#通用api信息)
|
||||||
|
- [API操作](#api操作)
|
||||||
|
- [安全性](#安全性)
|
||||||
|
- [样例](#样例)
|
||||||
|
- [多行的描述](#多行的描述)
|
||||||
|
- [用户自定义的具有数组类型的结构](#用户自定义的具有数组类型的结构)
|
||||||
|
- [响应对象中的模型组合](#响应对象中的模型组合)
|
||||||
|
- [在响应中增加头字段](#在响应中增加头字段)
|
||||||
|
- [使用多路径参数](#使用多路径参数)
|
||||||
|
- [结构体的示例值](#结构体的示例值)
|
||||||
|
- [结构体描述](#结构体描述)
|
||||||
|
- [使用`swaggertype`标签更改字段类型](#使用`swaggertype`标签更改字段类型)
|
||||||
|
- [使用`swaggerignore`标签排除字段](#使用swaggerignore标签排除字段)
|
||||||
|
- [将扩展信息添加到结构字段](#将扩展信息添加到结构字段)
|
||||||
|
- [对展示的模型重命名](#对展示的模型重命名)
|
||||||
|
- [如何使用安全性注释](#如何使用安全性注释)
|
||||||
|
- [项目相关](#项目相关)
|
||||||
|
|
||||||
|
## 快速开始
|
||||||
|
|
||||||
|
1. 将注释添加到API源代码中,请参阅声明性注释格式。
|
||||||
|
2. 使用如下命令下载swag:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
go get -u github.com/swaggo/swag/cmd/swag
|
||||||
|
```
|
||||||
|
|
||||||
|
从源码开始构建的话,需要有Go环境(1.9及以上版本)。
|
||||||
|
|
||||||
|
或者从github的release页面下载预编译好的二进制文件。
|
||||||
|
|
||||||
|
3. 在包含`main.go`文件的项目根目录运行`swag init`。这将会解析注释并生成需要的文件(`docs`文件夹和`docs/docs.go`)。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
swag init
|
||||||
|
```
|
||||||
|
|
||||||
|
确保导入了生成的`docs/docs.go`文件,这样特定的配置文件才会被初始化。如果通用API指数没有写在`main.go`中,可以使用`-g`标识符来告知swag。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
swag init -g http/api.go
|
||||||
|
```
|
||||||
|
|
||||||
|
## swag cli
|
||||||
|
|
||||||
|
```bash
|
||||||
|
swag init -h
|
||||||
|
NAME:
|
||||||
|
swag init - Create docs.go
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
swag init [command options] [arguments...]
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
--generalInfo value, -g value API通用信息所在的go源文件路径,如果是相对路径则基于API解析目录 (默认: "main.go")
|
||||||
|
--dir value, -d value API解析目录 (默认: "./")
|
||||||
|
--propertyStrategy value, -p value 结构体字段命名规则,三种:snakecase,camelcase,pascalcase (默认: "camelcase")
|
||||||
|
--output value, -o value 文件(swagger.json, swagger.yaml and doc.go)输出目录 (默认: "./docs")
|
||||||
|
--parseVendor 是否解析vendor目录里的go源文件,默认不
|
||||||
|
--parseDependency 是否解析依赖目录中的go源文件,默认不
|
||||||
|
--markdownFiles value, --md value 指定API的描述信息所使用的markdown文件所在的目录
|
||||||
|
--generatedTime 是否输出时间到输出文件docs.go的顶部,默认是
|
||||||
|
```
|
||||||
|
|
||||||
|
## 支持的Web框架
|
||||||
|
|
||||||
|
- [gin](http://github.com/swaggo/gin-swagger)
|
||||||
|
- [echo](http://github.com/swaggo/echo-swagger)
|
||||||
|
- [buffalo](https://github.com/swaggo/buffalo-swagger)
|
||||||
|
- [net/http](https://github.com/swaggo/http-swagger)
|
||||||
|
|
||||||
|
## 如何与Gin集成
|
||||||
|
|
||||||
|
[点击此处](https://github.com/swaggo/swag/tree/master/example/celler)查看示例源代码。
|
||||||
|
|
||||||
|
1. 使用`swag init`生成Swagger2.0文档后,导入如下代码包:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import "github.com/swaggo/gin-swagger" // gin-swagger middleware
|
||||||
|
import "github.com/swaggo/files" // swagger embed files
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 在`main.go`源代码中添加通用的API注释:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
// @title Swagger Example API
|
||||||
|
// @version 1.0
|
||||||
|
// @description This is a sample server celler server.
|
||||||
|
// @termsOfService http://swagger.io/terms/
|
||||||
|
|
||||||
|
// @contact.name API Support
|
||||||
|
// @contact.url http://www.swagger.io/support
|
||||||
|
// @contact.email support@swagger.io
|
||||||
|
|
||||||
|
// @license.name Apache 2.0
|
||||||
|
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
|
||||||
|
// @host localhost:8080
|
||||||
|
// @BasePath /api/v1
|
||||||
|
// @query.collection.format multi
|
||||||
|
|
||||||
|
// @securityDefinitions.basic BasicAuth
|
||||||
|
|
||||||
|
// @securityDefinitions.apikey ApiKeyAuth
|
||||||
|
// @in header
|
||||||
|
// @name Authorization
|
||||||
|
|
||||||
|
// @securitydefinitions.oauth2.application OAuth2Application
|
||||||
|
// @tokenUrl https://example.com/oauth/token
|
||||||
|
// @scope.write Grants write access
|
||||||
|
// @scope.admin Grants read and write access to administrative information
|
||||||
|
|
||||||
|
// @securitydefinitions.oauth2.implicit OAuth2Implicit
|
||||||
|
// @authorizationurl https://example.com/oauth/authorize
|
||||||
|
// @scope.write Grants write access
|
||||||
|
// @scope.admin Grants read and write access to administrative information
|
||||||
|
|
||||||
|
// @securitydefinitions.oauth2.password OAuth2Password
|
||||||
|
// @tokenUrl https://example.com/oauth/token
|
||||||
|
// @scope.read Grants read access
|
||||||
|
// @scope.write Grants write access
|
||||||
|
// @scope.admin Grants read and write access to administrative information
|
||||||
|
|
||||||
|
// @securitydefinitions.oauth2.accessCode OAuth2AccessCode
|
||||||
|
// @tokenUrl https://example.com/oauth/token
|
||||||
|
// @authorizationurl https://example.com/oauth/authorize
|
||||||
|
// @scope.admin Grants read and write access to administrative information
|
||||||
|
|
||||||
|
// @x-extension-openapi {"example": "value on a json format"}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
r := gin.Default()
|
||||||
|
|
||||||
|
c := controller.NewController()
|
||||||
|
|
||||||
|
v1 := r.Group("/api/v1")
|
||||||
|
{
|
||||||
|
accounts := v1.Group("/accounts")
|
||||||
|
{
|
||||||
|
accounts.GET(":id", c.ShowAccount)
|
||||||
|
accounts.GET("", c.ListAccounts)
|
||||||
|
accounts.POST("", c.AddAccount)
|
||||||
|
accounts.DELETE(":id", c.DeleteAccount)
|
||||||
|
accounts.PATCH(":id", c.UpdateAccount)
|
||||||
|
accounts.POST(":id/images", c.UploadAccountImage)
|
||||||
|
}
|
||||||
|
//...
|
||||||
|
}
|
||||||
|
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
|
||||||
|
r.Run(":8080")
|
||||||
|
}
|
||||||
|
//...
|
||||||
|
```
|
||||||
|
|
||||||
|
此外,可以动态设置一些通用的API信息。生成的代码包`docs`导出`SwaggerInfo`变量,使用该变量可以通过编码的方式设置标题、描述、版本、主机和基础路径。使用Gin的示例:
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/swaggo/files"
|
||||||
|
"github.com/swaggo/gin-swagger"
|
||||||
|
|
||||||
|
"./docs" // docs is generated by Swag CLI, you have to import it.
|
||||||
|
)
|
||||||
|
|
||||||
|
// @contact.name API Support
|
||||||
|
// @contact.url http://www.swagger.io/support
|
||||||
|
// @contact.email support@swagger.io
|
||||||
|
|
||||||
|
// @license.name Apache 2.0
|
||||||
|
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
|
||||||
|
// @termsOfService http://swagger.io/terms/
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
// programatically set swagger info
|
||||||
|
docs.SwaggerInfo.Title = "Swagger Example API"
|
||||||
|
docs.SwaggerInfo.Description = "This is a sample server Petstore server."
|
||||||
|
docs.SwaggerInfo.Version = "1.0"
|
||||||
|
docs.SwaggerInfo.Host = "petstore.swagger.io"
|
||||||
|
docs.SwaggerInfo.BasePath = "/v2"
|
||||||
|
docs.SwaggerInfo.Schemes = []string{"http", "https"}
|
||||||
|
|
||||||
|
r := gin.New()
|
||||||
|
|
||||||
|
// use ginSwagger middleware to serve the API docs
|
||||||
|
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
|
||||||
|
|
||||||
|
r.Run()
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 在`controller`代码中添加API操作注释:
|
||||||
|
|
||||||
|
```go
|
||||||
|
package controller
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/swaggo/swag/example/celler/httputil"
|
||||||
|
"github.com/swaggo/swag/example/celler/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ShowAccount godoc
|
||||||
|
// @Summary Show a account
|
||||||
|
// @Description get string by ID
|
||||||
|
// @ID get-string-by-int
|
||||||
|
// @Accept json
|
||||||
|
// @Produce json
|
||||||
|
// @Param id path int true "Account ID"
|
||||||
|
// @Success 200 {object} model.Account
|
||||||
|
// @Header 200 {string} Token "qwerty"
|
||||||
|
// @Failure 400 {object} httputil.HTTPError
|
||||||
|
// @Failure 404 {object} httputil.HTTPError
|
||||||
|
// @Failure 500 {object} httputil.HTTPError
|
||||||
|
// @Router /accounts/{id} [get]
|
||||||
|
func (c *Controller) ShowAccount(ctx *gin.Context) {
|
||||||
|
id := ctx.Param("id")
|
||||||
|
aid, err := strconv.Atoi(id)
|
||||||
|
if err != nil {
|
||||||
|
httputil.NewError(ctx, http.StatusBadRequest, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
account, err := model.AccountOne(aid)
|
||||||
|
if err != nil {
|
||||||
|
httputil.NewError(ctx, http.StatusNotFound, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ctx.JSON(http.StatusOK, account)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListAccounts godoc
|
||||||
|
// @Summary List accounts
|
||||||
|
// @Description get accounts
|
||||||
|
// @Accept json
|
||||||
|
// @Produce json
|
||||||
|
// @Param q query string false "name search by q"
|
||||||
|
// @Success 200 {array} model.Account
|
||||||
|
// @Header 200 {string} Token "qwerty"
|
||||||
|
// @Failure 400 {object} httputil.HTTPError
|
||||||
|
// @Failure 404 {object} httputil.HTTPError
|
||||||
|
// @Failure 500 {object} httputil.HTTPError
|
||||||
|
// @Router /accounts [get]
|
||||||
|
func (c *Controller) ListAccounts(ctx *gin.Context) {
|
||||||
|
q := ctx.Request.URL.Query().Get("q")
|
||||||
|
accounts, err := model.AccountsAll(q)
|
||||||
|
if err != nil {
|
||||||
|
httputil.NewError(ctx, http.StatusNotFound, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ctx.JSON(http.StatusOK, accounts)
|
||||||
|
}
|
||||||
|
|
||||||
|
//...
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
swag init
|
||||||
|
```
|
||||||
|
|
||||||
|
4. 运行程序,然后在浏览器中访问 http://localhost:8080/swagger/index.html。将看到Swagger 2.0 Api文档,如下所示:
|
||||||
|
|
||||||
|
![swagger_index.html](https://raw.githubusercontent.com/swaggo/swag/master/assets/swagger-image.png)
|
||||||
|
|
||||||
|
## 开发现状
|
||||||
|
|
||||||
|
[Swagger 2.0 文档](https://swagger.io/docs/specification/2-0/basic-structure/)
|
||||||
|
|
||||||
|
- [x] Basic Structure
|
||||||
|
- [x] API Host and Base Path
|
||||||
|
- [x] Paths and Operations
|
||||||
|
- [x] Describing Parameters
|
||||||
|
- [x] Describing Request Body
|
||||||
|
- [x] Describing Responses
|
||||||
|
- [x] MIME Types
|
||||||
|
- [x] Authentication
|
||||||
|
- [x] Basic Authentication
|
||||||
|
- [x] API Keys
|
||||||
|
- [x] Adding Examples
|
||||||
|
- [x] File Upload
|
||||||
|
- [x] Enums
|
||||||
|
- [x] Grouping Operations With Tags
|
||||||
|
- [ ] Swagger Extensions
|
||||||
|
|
||||||
|
## 声明式注释格式
|
||||||
|
|
||||||
|
## 通用API信息
|
||||||
|
|
||||||
|
**示例** [`celler/main.go`](https://github.com/swaggo/swag/blob/master/example/celler/main.go)
|
||||||
|
|
||||||
|
| 注释 | 说明 | 示例 |
|
||||||
|
| ----------------------- | ----------------------------------------------------------------------------------------------- | --------------------------------------------------------------- |
|
||||||
|
| title | **必填** 应用程序的名称。 | // @title Swagger Example API |
|
||||||
|
| version | **必填** 提供应用程序API的版本。 | // @version 1.0 |
|
||||||
|
| description | 应用程序的简短描述。 | // @description This is a sample server celler server. |
|
||||||
|
| tag.name | 标签的名称。 | // @tag.name This is the name of the tag |
|
||||||
|
| tag.description | 标签的描述。 | // @tag.description Cool Description |
|
||||||
|
| tag.docs.url | 标签的外部文档的URL。 | // @tag.docs.url https://example.com |
|
||||||
|
| tag.docs.description | 标签的外部文档说明。 | // @tag.docs.description Best example documentation |
|
||||||
|
| termsOfService | API的服务条款。 | // @termsOfService http://swagger.io/terms/ |
|
||||||
|
| contact.name | 公开的API的联系信息。 | // @contact.name API Support |
|
||||||
|
| contact.url | 联系信息的URL。 必须采用网址格式。 | // @contact.url http://www.swagger.io/support |
|
||||||
|
| contact.email | 联系人/组织的电子邮件地址。 必须采用电子邮件地址的格式。 | // @contact.email support@swagger.io |
|
||||||
|
| license.name | **必填** 用于API的许可证名称。 | // @license.name Apache 2.0 |
|
||||||
|
| license.url | 用于API的许可证的URL。 必须采用网址格式。 | // @license.url http://www.apache.org/licenses/LICENSE-2.0.html |
|
||||||
|
| host | 运行API的主机(主机名或IP地址)。 | // @host localhost:8080 |
|
||||||
|
| BasePath | 运行API的基本路径。 | // @BasePath /api/v1 |
|
||||||
|
| query.collection.format | 请求URI query里数组参数的默认格式:csv,multi,pipes,tsv,ssv。 如果未设置,则默认为csv。 | // @query.collection.format multi |
|
||||||
|
| schemes | 用空格分隔的请求的传输协议。 | // @schemes http https |
|
||||||
|
| x-name | 扩展的键必须以x-开头,并且只能使用json值 | // @x-example-key {"key": "value"} |
|
||||||
|
|
||||||
|
### 使用Markdown描述
|
||||||
|
|
||||||
|
如果文档中的短字符串不足以完整表达,或者需要展示图片,代码示例等类似的内容,则可能需要使用Markdown描述。要使用Markdown描述,请使用一下注释。
|
||||||
|
|
||||||
|
| 注释 | 说明 | 示例 |
|
||||||
|
| ------------------------ | ------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------- |
|
||||||
|
| title | **必填** 应用程序的名称。 | // @title Swagger Example API |
|
||||||
|
| version | **必填** 提供应用程序API的版本。 | // @version 1.0 |
|
||||||
|
| description.markdown | 应用程序的简短描述。 从`api.md`文件中解析。 这是`@description`的替代用法。 | // @description.markdown No value needed, this parses the description from api.md |
|
||||||
|
| tag.name | 标签的名称。 | // @tag.name This is the name of the tag |
|
||||||
|
| tag.description.markdown | 标签说明,这是`tag.description`的替代用法。 该描述将从名为`tagname.md的`文件中读取。 | // @tag.description.markdown |
|
||||||
|
|
||||||
|
## API操作
|
||||||
|
|
||||||
|
Example [celler/controller](https://github.com/swaggo/swag/tree/master/example/celler/controller)
|
||||||
|
|
||||||
|
| 注释 | 描述 | |
|
||||||
|
| -------------------- | ------------------------------------------------------------------------------------------------------- | -------------------------------------------------- |
|
||||||
|
| description | 操作行为的详细说明。 |
|
||||||
|
| description.markdown | 应用程序的简短描述。该描述将从名为`endpointname.md`的文件中读取。 | // @description.file endpoint.description.markdown |
|
||||||
|
| id | 用于标识操作的唯一字符串。在所有API操作中必须唯一。 |
|
||||||
|
| tags | 每个API操作的标签列表,以逗号分隔。 |
|
||||||
|
| summary | 该操作的简短摘要。 |
|
||||||
|
| accept | API可以使用的MIME类型的列表。值必须如“[Mime类型](#mime-types)”中所述。 |
|
||||||
|
| produce | API可以生成的MIME类型的列表。值必须如“[Mime类型](#mime-types)”中所述。 |
|
||||||
|
| param | 用空格分隔的参数。`param name`,`param type`,`data type`,`is mandatory?`,`comment` `attribute(optional)` |
|
||||||
|
| security | 每个API操作的[安全性](#security)。 |
|
||||||
|
| success | 以空格分隔的成功响应。`return code`,`{param type}`,`data type`,`comment` |
|
||||||
|
| failure | 以空格分隔的故障响应。`return code`,`{param type}`,`data type`,`comment` |
|
||||||
|
| header | 以空格分隔的头字段。 `return code`,`{param type}`,`data type`,`comment` |
|
||||||
|
| router | 以空格分隔的路径定义。 `path`,`[httpMethod]` |
|
||||||
|
| x-name | 扩展字段必须以`x-`开头,并且只能使用json值。 |
|
||||||
|
|
||||||
|
## Mime类型
|
||||||
|
|
||||||
|
`swag` g接受所有格式正确的MIME类型, 即使匹配 `*/*`。除此之外,`swag`还接受某些MIME类型的别名,如下所示:
|
||||||
|
|
||||||
|
| Alias | MIME Type |
|
||||||
|
| --------------------- | --------------------------------- |
|
||||||
|
| json | application/json |
|
||||||
|
| xml | text/xml |
|
||||||
|
| plain | text/plain |
|
||||||
|
| html | text/html |
|
||||||
|
| mpfd | multipart/form-data |
|
||||||
|
| x-www-form-urlencoded | application/x-www-form-urlencoded |
|
||||||
|
| json-api | application/vnd.api+json |
|
||||||
|
| json-stream | application/x-json-stream |
|
||||||
|
| octet-stream | application/octet-stream |
|
||||||
|
| png | image/png |
|
||||||
|
| jpeg | image/jpeg |
|
||||||
|
| gif | image/gif |
|
||||||
|
|
||||||
|
## 参数类型
|
||||||
|
|
||||||
|
- query
|
||||||
|
- path
|
||||||
|
- header
|
||||||
|
- body
|
||||||
|
- formData
|
||||||
|
|
||||||
|
## 数据类型
|
||||||
|
|
||||||
|
- string (string)
|
||||||
|
- integer (int, uint, uint32, uint64)
|
||||||
|
- number (float32)
|
||||||
|
- boolean (bool)
|
||||||
|
- user defined struct
|
||||||
|
|
||||||
|
## 安全性
|
||||||
|
|
||||||
|
| 注释 | 描述 | 参数 | 示例 |
|
||||||
|
| -------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------- | ------------------------------------------------------------ |
|
||||||
|
| securitydefinitions.basic | [Basic](https://swagger.io/docs/specification/2-0/authentication/basic-authentication/) auth. | | // @securityDefinitions.basic BasicAuth |
|
||||||
|
| securitydefinitions.apikey | [API key](https://swagger.io/docs/specification/2-0/authentication/api-keys/) auth. | in, name | // @securityDefinitions.apikey ApiKeyAuth |
|
||||||
|
| securitydefinitions.oauth2.application | [OAuth2 application](https://swagger.io/docs/specification/authentication/oauth2/) auth. | tokenUrl, scope | // @securitydefinitions.oauth2.application OAuth2Application |
|
||||||
|
| securitydefinitions.oauth2.implicit | [OAuth2 implicit](https://swagger.io/docs/specification/authentication/oauth2/) auth. | authorizationUrl, scope | // @securitydefinitions.oauth2.implicit OAuth2Implicit |
|
||||||
|
| securitydefinitions.oauth2.password | [OAuth2 password](https://swagger.io/docs/specification/authentication/oauth2/) auth. | tokenUrl, scope | // @securitydefinitions.oauth2.password OAuth2Password |
|
||||||
|
| securitydefinitions.oauth2.accessCode | [OAuth2 access code](https://swagger.io/docs/specification/authentication/oauth2/) auth. | tokenUrl, authorizationUrl, scope | // @securitydefinitions.oauth2.accessCode OAuth2AccessCode |
|
||||||
|
|
||||||
|
| 参数注释 | 示例 |
|
||||||
|
| ---------------- | -------------------------------------------------------- |
|
||||||
|
| in | // @in header |
|
||||||
|
| name | // @name Authorization |
|
||||||
|
| tokenUrl | // @tokenUrl https://example.com/oauth/token |
|
||||||
|
| authorizationurl | // @authorizationurl https://example.com/oauth/authorize |
|
||||||
|
| scope.hoge | // @scope.write Grants write access |
|
||||||
|
|
||||||
|
## 属性
|
||||||
|
|
||||||
|
```go
|
||||||
|
// @Param enumstring query string false "string enums" Enums(A, B, C)
|
||||||
|
// @Param enumint query int false "int enums" Enums(1, 2, 3)
|
||||||
|
// @Param enumnumber query number false "int enums" Enums(1.1, 1.2, 1.3)
|
||||||
|
// @Param string query string false "string valid" minlength(5) maxlength(10)
|
||||||
|
// @Param int query int false "int valid" mininum(1) maxinum(10)
|
||||||
|
// @Param default query string false "string default" default(A)
|
||||||
|
// @Param collection query []string false "string collection" collectionFormat(multi)
|
||||||
|
```
|
||||||
|
|
||||||
|
也适用于结构体字段:
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Foo struct {
|
||||||
|
Bar string `minLength:"4" maxLength:"16"`
|
||||||
|
Baz int `minimum:"10" maximum:"20" default:"15"`
|
||||||
|
Qux []string `enums:"foo,bar,baz"`
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 当前可用的
|
||||||
|
|
||||||
|
| 字段名 | 类型 | 描述 |
|
||||||
|
| ---------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
|
| default | * | 声明如果未提供任何参数,则服务器将使用的默认参数值,例如,如果请求中的客户端未提供该参数,则用于控制每页结果数的“计数”可能默认为100。 (注意:“default”对于必需的参数没有意义)。参看 https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-6.2。 与JSON模式不同,此值务必符合此参数的定义[类型](#parameterType)。 |
|
||||||
|
| maximum | `number` | 参看 https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.1.2. |
|
||||||
|
| minimum | `number` | 参看 https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.1.3. |
|
||||||
|
| maxLength | `integer` | 参看 https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.1. |
|
||||||
|
| minLength | `integer` | 参看 https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.2. |
|
||||||
|
| enums | [\*] | 参看 https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.5.1. |
|
||||||
|
| format | `string` | 上面提到的[类型](#parameterType)的扩展格式。有关更多详细信息,请参见[数据类型格式](https://swagger.io/specification/v2/#dataTypeFormat)。 |
|
||||||
|
| collectionFormat | `string` | 指定query数组参数的格式。 可能的值为: <ul><li>`csv` - 逗号分隔值 `foo,bar`. <li>`ssv` - 空格分隔值 `foo bar`. <li>`tsv` - 制表符分隔值 `foo\tbar`. <li>`pipes` - 管道符分隔值 <code>foo|bar</code>. <li>`multi` - 对应于多个参数实例,而不是单个实例 `foo=bar&foo=baz` 的多个值。这仅对“`query`”或“`formData`”中的参数有效。 </ul> 默认值是 `csv`。 |
|
||||||
|
|
||||||
|
### 进一步的
|
||||||
|
|
||||||
|
| 字段名 | 类型 | 描述 |
|
||||||
|
| ----------- | :-------: | ---------------------------------------------------------------------------------- |
|
||||||
|
| multipleOf | `number` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.1.1. |
|
||||||
|
| pattern | `string` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.3. |
|
||||||
|
| maxItems | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.2. |
|
||||||
|
| minItems | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.3. |
|
||||||
|
| uniqueItems | `boolean` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.4. |
|
||||||
|
|
||||||
|
## 样例
|
||||||
|
|
||||||
|
### 多行的描述
|
||||||
|
|
||||||
|
可以在常规api描述或路由定义中添加跨越多行的描述,如下所示:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// @description This is the first line
|
||||||
|
// @description This is the second line
|
||||||
|
// @description And so forth.
|
||||||
|
```
|
||||||
|
|
||||||
|
### 用户自定义的具有数组类型的结构
|
||||||
|
|
||||||
|
```go
|
||||||
|
// @Success 200 {array} model.Account <-- This is a user defined struct.
|
||||||
|
```
|
||||||
|
|
||||||
|
```go
|
||||||
|
package model
|
||||||
|
|
||||||
|
type Account struct {
|
||||||
|
ID int `json:"id" example:"1"`
|
||||||
|
Name string `json:"name" example:"account name"`
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 响应对象中的模型组合
|
||||||
|
|
||||||
|
```go
|
||||||
|
// JSONResult的data字段类型将被proto.Order类型替换
|
||||||
|
@success 200 {object} jsonresult.JSONResult{data=proto.Order} "desc"
|
||||||
|
```
|
||||||
|
|
||||||
|
```go
|
||||||
|
type JSONResult struct {
|
||||||
|
Code int `json:"code" `
|
||||||
|
Message string `json:"message"`
|
||||||
|
Data interface{} `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Order struct { //in `proto` package
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- 还支持对象数组和原始类型作为嵌套响应
|
||||||
|
|
||||||
|
```go
|
||||||
|
@success 200 {object} jsonresult.JSONResult{data=[]proto.Order} "desc"
|
||||||
|
@success 200 {object} jsonresult.JSONResult{data=string} "desc"
|
||||||
|
@success 200 {object} jsonresult.JSONResult{data=[]string} "desc"
|
||||||
|
```
|
||||||
|
|
||||||
|
- 替换多个字段的类型。如果某字段不存在,将添加该字段。
|
||||||
|
|
||||||
|
```go
|
||||||
|
@success 200 {object} jsonresult.JSONResult{data1=string,data2=[]string,data3=proto.Order,data4=[]proto.Order} "desc"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 在响应中增加头字段
|
||||||
|
|
||||||
|
```go
|
||||||
|
// @Success 200 {string} string "ok"
|
||||||
|
// @Header 200 {string} Location "/entity/1"
|
||||||
|
// @Header 200 {string} Token "qwerty"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 使用多路径参数
|
||||||
|
|
||||||
|
```go
|
||||||
|
/// ...
|
||||||
|
// @Param group_id path int true "Group ID"
|
||||||
|
// @Param account_id path int true "Account ID"
|
||||||
|
// ...
|
||||||
|
// @Router /examples/groups/{group_id}/accounts/{account_id} [get]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 结构体的示例值
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Account struct {
|
||||||
|
ID int `json:"id" example:"1"`
|
||||||
|
Name string `json:"name" example:"account name"`
|
||||||
|
PhotoUrls []string `json:"photo_urls" example:"http://test/image/1.jpg,http://test/image/2.jpg"`
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 结构体描述
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Account struct {
|
||||||
|
// ID this is userid
|
||||||
|
ID int `json:"id"`
|
||||||
|
Name string `json:"name"` // This is Name
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 使用`swaggertype`标签更改字段类型
|
||||||
|
|
||||||
|
[#201](https://github.com/swaggo/swag/issues/201#issuecomment-475479409)
|
||||||
|
|
||||||
|
```go
|
||||||
|
type TimestampTime struct {
|
||||||
|
time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
///实现encoding.JSON.Marshaler接口
|
||||||
|
func (t *TimestampTime) MarshalJSON() ([]byte, error) {
|
||||||
|
bin := make([]byte, 16)
|
||||||
|
bin = strconv.AppendInt(bin[:0], t.Time.Unix(), 10)
|
||||||
|
return bin, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
///实现encoding.JSON.Unmarshaler接口
|
||||||
|
func (t *TimestampTime) UnmarshalJSON(bin []byte) error {
|
||||||
|
v, err := strconv.ParseInt(string(bin), 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
t.Time = time.Unix(v, 0)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
///
|
||||||
|
|
||||||
|
type Account struct {
|
||||||
|
// 使用`swaggertype`标签将别名类型更改为内置类型integer
|
||||||
|
ID sql.NullInt64 `json:"id" swaggertype:"integer"`
|
||||||
|
|
||||||
|
// 使用`swaggertype`标签更改struct类型为内置类型integer
|
||||||
|
RegisterTime TimestampTime `json:"register_time" swaggertype:"primitive,integer"`
|
||||||
|
|
||||||
|
// Array types can be overridden using "array,<prim_type>" format
|
||||||
|
Coeffs []big.Float `json:"coeffs" swaggertype:"array,number"`
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
[#379](https://github.com/swaggo/swag/issues/379)
|
||||||
|
|
||||||
|
```go
|
||||||
|
type CerticateKeyPair struct {
|
||||||
|
Crt []byte `json:"crt" swaggertype:"string" format:"base64" example:"U3dhZ2dlciByb2Nrcw=="`
|
||||||
|
Key []byte `json:"key" swaggertype:"string" format:"base64" example:"U3dhZ2dlciByb2Nrcw=="`
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
生成的swagger文档如下:
|
||||||
|
|
||||||
|
```go
|
||||||
|
"api.MyBinding": {
|
||||||
|
"type":"object",
|
||||||
|
"properties":{
|
||||||
|
"crt":{
|
||||||
|
"type":"string",
|
||||||
|
"format":"base64",
|
||||||
|
"example":"U3dhZ2dlciByb2Nrcw=="
|
||||||
|
},
|
||||||
|
"key":{
|
||||||
|
"type":"string",
|
||||||
|
"format":"base64",
|
||||||
|
"example":"U3dhZ2dlciByb2Nrcw=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 使用`swaggerignore`标签排除字段
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Account struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Ignored int `swaggerignore:"true"`
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 将扩展信息添加到结构字段
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Account struct {
|
||||||
|
ID string `json:"id" extensions:"x-nullable,x-abc=def"` // 扩展字段必须以"x-"开头
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
生成swagger文档,如下所示:
|
||||||
|
|
||||||
|
```go
|
||||||
|
"Account": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"id": {
|
||||||
|
"type": "string",
|
||||||
|
"x-nullable": true,
|
||||||
|
"x-abc": "def"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 对展示的模型重命名
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Resp struct {
|
||||||
|
Code int
|
||||||
|
}//@name Response
|
||||||
|
```
|
||||||
|
|
||||||
|
### 如何使用安全性注释
|
||||||
|
|
||||||
|
通用API信息。
|
||||||
|
|
||||||
|
```go
|
||||||
|
// @securityDefinitions.basic BasicAuth
|
||||||
|
|
||||||
|
// @securitydefinitions.oauth2.application OAuth2Application
|
||||||
|
// @tokenUrl https://example.com/oauth/token
|
||||||
|
// @scope.write Grants write access
|
||||||
|
// @scope.admin Grants read and write access to administrative information
|
||||||
|
```
|
||||||
|
|
||||||
|
每个API操作。
|
||||||
|
|
||||||
|
```go
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
```
|
||||||
|
|
||||||
|
使用AND条件。
|
||||||
|
|
||||||
|
```go
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Security OAuth2Application[write, admin]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 项目相关
|
||||||
|
|
||||||
|
This project was inspired by [yvasiyarov/swagger](https://github.com/yvasiyarov/swagger) but we simplified the usage and added support a variety of [web frameworks](#supported-web-frameworks). Gopher image source is [tenntenn/gopher-stickers](https://github.com/tenntenn/gopher-stickers). It has licenses [creative commons licensing](http://creativecommons.org/licenses/by/3.0/deed.en).
|
||||||
|
|
||||||
|
## 贡献者
|
||||||
|
|
||||||
|
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
|
||||||
|
<a href="https://github.com/swaggo/swag/graphs/contributors"><img src="https://opencollective.com/swag/contributors.svg?width=890&button=false" /></a>
|
||||||
|
|
||||||
|
## 支持者
|
||||||
|
|
||||||
|
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/swag#backer)]
|
||||||
|
|
||||||
|
<a href="https://opencollective.com/swag#backers" target="_blank"><img src="https://opencollective.com/swag/backers.svg?width=890"></a>
|
||||||
|
|
||||||
|
## 赞助商
|
||||||
|
|
||||||
|
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/swag#sponsor)]
|
||||||
|
|
||||||
|
<a href="https://opencollective.com/swag/sponsor/0/website" target="_blank"><img src="https://opencollective.com/swag/sponsor/0/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/swag/sponsor/1/website" target="_blank"><img src="https://opencollective.com/swag/sponsor/1/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/swag/sponsor/2/website" target="_blank"><img src="https://opencollective.com/swag/sponsor/2/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/swag/sponsor/3/website" target="_blank"><img src="https://opencollective.com/swag/sponsor/3/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/swag/sponsor/4/website" target="_blank"><img src="https://opencollective.com/swag/sponsor/4/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/swag/sponsor/5/website" target="_blank"><img src="https://opencollective.com/swag/sponsor/5/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/swag/sponsor/6/website" target="_blank"><img src="https://opencollective.com/swag/sponsor/6/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/swag/sponsor/7/website" target="_blank"><img src="https://opencollective.com/swag/sponsor/7/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/swag/sponsor/8/website" target="_blank"><img src="https://opencollective.com/swag/sponsor/8/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/swag/sponsor/9/website" target="_blank"><img src="https://opencollective.com/swag/sponsor/9/avatar.svg"></a>
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fswaggo%2Fswag.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fswaggo%2Fswag?ref=badge_large)
|
162
vendor/github.com/swaggo/swag/cmd/swag/main.go
generated
vendored
162
vendor/github.com/swaggo/swag/cmd/swag/main.go
generated
vendored
|
@ -7,89 +7,111 @@ import (
|
||||||
|
|
||||||
"github.com/swaggo/swag"
|
"github.com/swaggo/swag"
|
||||||
"github.com/swaggo/swag/gen"
|
"github.com/swaggo/swag/gen"
|
||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
const searchDirFlag = "dir"
|
const (
|
||||||
const generalInfoFlag = "generalInfo"
|
searchDirFlag = "dir"
|
||||||
const propertyStrategyFlag = "propertyStrategy"
|
excludeFlag = "exclude"
|
||||||
const outputFlag = "output"
|
generalInfoFlag = "generalInfo"
|
||||||
const parseVendorFlag = "parseVendor"
|
propertyStrategyFlag = "propertyStrategy"
|
||||||
const parseDependency = "parseDependency"
|
outputFlag = "output"
|
||||||
const markdownFilesDirFlag = "markdownFiles"
|
parseVendorFlag = "parseVendor"
|
||||||
|
parseDependencyFlag = "parseDependency"
|
||||||
|
markdownFilesFlag = "markdownFiles"
|
||||||
|
parseInternal = "parseInternal"
|
||||||
|
generatedTimeFlag = "generatedTime"
|
||||||
|
)
|
||||||
|
|
||||||
|
var initFlags = []cli.Flag{
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: generalInfoFlag,
|
||||||
|
Aliases: []string{"g"},
|
||||||
|
Value: "main.go",
|
||||||
|
Usage: "Go file path in which 'swagger general API Info' is written",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: searchDirFlag,
|
||||||
|
Aliases: []string{"d"},
|
||||||
|
Value: "./",
|
||||||
|
Usage: "Directory you want to parse",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: excludeFlag,
|
||||||
|
Usage: "exclude directories and files when searching, comma separated",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: propertyStrategyFlag,
|
||||||
|
Aliases: []string{"p"},
|
||||||
|
Value: "camelcase",
|
||||||
|
Usage: "Property Naming Strategy like snakecase,camelcase,pascalcase",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: outputFlag,
|
||||||
|
Aliases: []string{"o"},
|
||||||
|
Value: "./docs",
|
||||||
|
Usage: "Output directory for all the generated files(swagger.json, swagger.yaml and doc.go)",
|
||||||
|
},
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: parseVendorFlag,
|
||||||
|
Usage: "Parse go files in 'vendor' folder, disabled by default",
|
||||||
|
},
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: parseDependencyFlag,
|
||||||
|
Usage: "Parse go files in outside dependency folder, disabled by default",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: markdownFilesFlag,
|
||||||
|
Aliases: []string{"md"},
|
||||||
|
Value: "",
|
||||||
|
Usage: "Parse folder containing markdown files to use as description, disabled by default",
|
||||||
|
},
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "parseInternal",
|
||||||
|
Usage: "Parse go files in internal packages, disabled by default",
|
||||||
|
},
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "generatedTime",
|
||||||
|
Usage: "Generate timestamp at the top of docs.go, true by default",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func initAction(c *cli.Context) error {
|
||||||
|
strategy := c.String(propertyStrategyFlag)
|
||||||
|
|
||||||
|
switch strategy {
|
||||||
|
case swag.CamelCase, swag.SnakeCase, swag.PascalCase:
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("not supported %s propertyStrategy", strategy)
|
||||||
|
}
|
||||||
|
|
||||||
|
return gen.New().Build(&gen.Config{
|
||||||
|
SearchDir: c.String(searchDirFlag),
|
||||||
|
Excludes: c.String(excludeFlag),
|
||||||
|
MainAPIFile: c.String(generalInfoFlag),
|
||||||
|
PropNamingStrategy: strategy,
|
||||||
|
OutputDir: c.String(outputFlag),
|
||||||
|
ParseVendor: c.Bool(parseVendorFlag),
|
||||||
|
ParseDependency: c.Bool(parseDependencyFlag),
|
||||||
|
MarkdownFilesDir: c.String(markdownFilesFlag),
|
||||||
|
ParseInternal: c.Bool(parseInternal),
|
||||||
|
GeneratedTime: c.Bool(generatedTimeFlag),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
app := cli.NewApp()
|
app := cli.NewApp()
|
||||||
app.Version = swag.Version
|
app.Version = swag.Version
|
||||||
app.Usage = "Automatically generate RESTful API documentation with Swagger 2.0 for Go."
|
app.Usage = "Automatically generate RESTful API documentation with Swagger 2.0 for Go."
|
||||||
app.Commands = []cli.Command{
|
app.Commands = []*cli.Command{
|
||||||
{
|
{
|
||||||
Name: "init",
|
Name: "init",
|
||||||
Aliases: []string{"i"},
|
Aliases: []string{"i"},
|
||||||
Usage: "Create docs.go",
|
Usage: "Create docs.go",
|
||||||
Action: func(c *cli.Context) error {
|
Action: initAction,
|
||||||
searchDir := c.String(searchDirFlag)
|
Flags: initFlags,
|
||||||
mainAPIFile := c.String(generalInfoFlag)
|
|
||||||
strategy := c.String(propertyStrategyFlag)
|
|
||||||
outputDir := c.String(outputFlag)
|
|
||||||
parseVendor := c.Bool(parseVendorFlag)
|
|
||||||
parseDependency := c.Bool(parseDependency)
|
|
||||||
markdownFilesDir := c.String(markdownFilesDirFlag)
|
|
||||||
|
|
||||||
switch strategy {
|
|
||||||
case swag.CamelCase, swag.SnakeCase, swag.PascalCase:
|
|
||||||
default:
|
|
||||||
return fmt.Errorf("not supported %s propertyStrategy", strategy)
|
|
||||||
}
|
|
||||||
|
|
||||||
return gen.New().Build(&gen.Config{
|
|
||||||
SearchDir: searchDir,
|
|
||||||
MainAPIFile: mainAPIFile,
|
|
||||||
PropNamingStrategy: strategy,
|
|
||||||
OutputDir: outputDir,
|
|
||||||
ParseVendor: parseVendor,
|
|
||||||
ParseDependency: parseDependency,
|
|
||||||
MarkdownFilesDir: markdownFilesDir,
|
|
||||||
})
|
|
||||||
},
|
|
||||||
Flags: []cli.Flag{
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "generalInfo, g",
|
|
||||||
Value: "main.go",
|
|
||||||
Usage: "Go file path in which 'swagger general API Info' is written",
|
|
||||||
},
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "dir, d",
|
|
||||||
Value: "./",
|
|
||||||
Usage: "Directory you want to parse",
|
|
||||||
},
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "propertyStrategy, p",
|
|
||||||
Value: "camelcase",
|
|
||||||
Usage: "Property Naming Strategy like snakecase,camelcase,pascalcase",
|
|
||||||
},
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "output, o",
|
|
||||||
Value: "./docs",
|
|
||||||
Usage: "Output directory for al the generated files(swagger.json, swagger.yaml and doc.go)",
|
|
||||||
},
|
|
||||||
cli.BoolFlag{
|
|
||||||
Name: "parseVendor",
|
|
||||||
Usage: "Parse go files in 'vendor' folder, disabled by default",
|
|
||||||
},
|
|
||||||
cli.BoolFlag{
|
|
||||||
Name: "parseDependency",
|
|
||||||
Usage: "Parse go files in outside dependency folder, disabled by default",
|
|
||||||
},
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "markdownFiles, md",
|
|
||||||
Value: "",
|
|
||||||
Usage: "Parse folder containing markdown files to use as description, disabled by default",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
err := app.Run(os.Args)
|
err := app.Run(os.Args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
|
|
124
vendor/github.com/swaggo/swag/gen/gen.go
generated
vendored
124
vendor/github.com/swaggo/swag/gen/gen.go
generated
vendored
|
@ -13,18 +13,25 @@ import (
|
||||||
"text/template"
|
"text/template"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/go-openapi/spec"
|
|
||||||
|
|
||||||
"github.com/ghodss/yaml"
|
"github.com/ghodss/yaml"
|
||||||
|
"github.com/go-openapi/spec"
|
||||||
"github.com/swaggo/swag"
|
"github.com/swaggo/swag"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Gen presents a generate tool for swag.
|
// Gen presents a generate tool for swag.
|
||||||
type Gen struct{}
|
type Gen struct {
|
||||||
|
jsonIndent func(data interface{}) ([]byte, error)
|
||||||
|
jsonToYAML func(data []byte) ([]byte, error)
|
||||||
|
}
|
||||||
|
|
||||||
// New creates a new Gen.
|
// New creates a new Gen.
|
||||||
func New() *Gen {
|
func New() *Gen {
|
||||||
return &Gen{}
|
return &Gen{
|
||||||
|
jsonIndent: func(data interface{}) ([]byte, error) {
|
||||||
|
return json.MarshalIndent(data, "", " ")
|
||||||
|
},
|
||||||
|
jsonToYAML: yaml.JSONToYAML,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Config presents Gen configurations.
|
// Config presents Gen configurations.
|
||||||
|
@ -32,7 +39,10 @@ type Config struct {
|
||||||
// SearchDir the swag would be parse
|
// SearchDir the swag would be parse
|
||||||
SearchDir string
|
SearchDir string
|
||||||
|
|
||||||
// OutputDir represents the output directory for al the generated files
|
// excludes dirs and files in SearchDir,comma separated
|
||||||
|
Excludes string
|
||||||
|
|
||||||
|
// OutputDir represents the output directory for all the generated files
|
||||||
OutputDir string
|
OutputDir string
|
||||||
|
|
||||||
// MainAPIFile the Go file path in which 'swagger general API Info' is written
|
// MainAPIFile the Go file path in which 'swagger general API Info' is written
|
||||||
|
@ -47,8 +57,14 @@ type Config struct {
|
||||||
// ParseDependencies whether swag should be parse outside dependency folder
|
// ParseDependencies whether swag should be parse outside dependency folder
|
||||||
ParseDependency bool
|
ParseDependency bool
|
||||||
|
|
||||||
|
// ParseInternal whether swag should parse internal packages
|
||||||
|
ParseInternal bool
|
||||||
|
|
||||||
// MarkdownFilesDir used to find markdownfiles, which can be used for tag descriptions
|
// MarkdownFilesDir used to find markdownfiles, which can be used for tag descriptions
|
||||||
MarkdownFilesDir string
|
MarkdownFilesDir string
|
||||||
|
|
||||||
|
// GeneratedTime whether swag should generate the timestamp at the top of docs.go
|
||||||
|
GeneratedTime bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build builds swagger json file for given searchDir and mainAPIFile. Returns json
|
// Build builds swagger json file for given searchDir and mainAPIFile. Returns json
|
||||||
|
@ -58,10 +74,12 @@ func (g *Gen) Build(config *Config) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Println("Generate swagger docs....")
|
log.Println("Generate swagger docs....")
|
||||||
p := swag.New(swag.SetMarkdownFileDirectory(config.MarkdownFilesDir))
|
p := swag.New(swag.SetMarkdownFileDirectory(config.MarkdownFilesDir),
|
||||||
|
swag.SetExcludedDirsAndFiles(config.Excludes))
|
||||||
p.PropNamingStrategy = config.PropNamingStrategy
|
p.PropNamingStrategy = config.PropNamingStrategy
|
||||||
p.ParseVendor = config.ParseVendor
|
p.ParseVendor = config.ParseVendor
|
||||||
p.ParseDependency = config.ParseDependency
|
p.ParseDependency = config.ParseDependency
|
||||||
|
p.ParseInternal = config.ParseInternal
|
||||||
|
|
||||||
if err := p.ParseAPI(config.SearchDir, config.MainAPIFile); err != nil {
|
if err := p.ParseAPI(config.SearchDir, config.MainAPIFile); err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -77,64 +95,65 @@ func (g *Gen) Build(config *Config) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
docs, err := os.Create(path.Join(config.OutputDir, "docs.go"))
|
packageName := path.Base(config.OutputDir)
|
||||||
|
docFileName := path.Join(config.OutputDir, "docs.go")
|
||||||
|
jsonFileName := path.Join(config.OutputDir, "swagger.json")
|
||||||
|
yamlFileName := path.Join(config.OutputDir, "swagger.yaml")
|
||||||
|
|
||||||
|
docs, err := os.Create(docFileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer docs.Close()
|
defer docs.Close()
|
||||||
|
|
||||||
swaggerJSON, err := os.Create(path.Join(config.OutputDir, "swagger.json"))
|
err = g.writeFile(b, jsonFileName)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer swaggerJSON.Close()
|
|
||||||
|
|
||||||
if _, err := swaggerJSON.Write(b); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
swaggerYAML, err := os.Create(path.Join(config.OutputDir, "swagger.yaml"))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
defer swaggerYAML.Close()
|
y, err := g.jsonToYAML(b)
|
||||||
y, err := yaml.JSONToYAML(b)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot covert json to yaml error: %s", err)
|
return fmt.Errorf("cannot convert json to yaml error: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := swaggerYAML.Write(y); err != nil {
|
err = g.writeFile(y, yamlFileName)
|
||||||
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write doc
|
// Write doc
|
||||||
err = g.writeGoDoc(docs, swagger)
|
err = g.writeGoDoc(packageName, docs, swagger, config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("create docs.go at %+v", docs.Name())
|
log.Printf("create docs.go at %+v", docFileName)
|
||||||
log.Printf("create swagger.json at %+v", swaggerJSON.Name())
|
log.Printf("create swagger.json at %+v", jsonFileName)
|
||||||
log.Printf("create swagger.yaml at %+v", swaggerYAML.Name())
|
log.Printf("create swagger.yaml at %+v", yamlFileName)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *Gen) jsonIndent(data interface{}) ([]byte, error) {
|
func (g *Gen) writeFile(b []byte, file string) error {
|
||||||
return json.MarshalIndent(data, "", " ")
|
f, err := os.Create(file)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
_, err = f.Write(b)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *Gen) formatSource(src []byte) []byte {
|
func (g *Gen) formatSource(src []byte) []byte {
|
||||||
code, err := format.Source(src)
|
code, err := format.Source(src)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
code = src // Output the unformated code anyway
|
code = src // Output the unformatted code anyway
|
||||||
}
|
}
|
||||||
return code
|
return code
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *Gen) writeGoDoc(output io.Writer, swagger *spec.Swagger) error {
|
func (g *Gen) writeGoDoc(packageName string, output io.Writer, swagger *spec.Swagger, config *Config) error {
|
||||||
|
|
||||||
generator, err := template.New("swagger_info").Funcs(template.FuncMap{
|
generator, err := template.New("swagger_info").Funcs(template.FuncMap{
|
||||||
"printDoc": func(v string) string {
|
"printDoc": func(v string) string {
|
||||||
// Add schemes
|
// Add schemes
|
||||||
|
@ -186,23 +205,27 @@ func (g *Gen) writeGoDoc(output io.Writer, swagger *spec.Swagger) error {
|
||||||
|
|
||||||
buffer := &bytes.Buffer{}
|
buffer := &bytes.Buffer{}
|
||||||
err = generator.Execute(buffer, struct {
|
err = generator.Execute(buffer, struct {
|
||||||
Timestamp time.Time
|
Timestamp time.Time
|
||||||
Doc string
|
GeneratedTime bool
|
||||||
Host string
|
Doc string
|
||||||
BasePath string
|
Host string
|
||||||
Schemes []string
|
PackageName string
|
||||||
Title string
|
BasePath string
|
||||||
Description string
|
Schemes []string
|
||||||
Version string
|
Title string
|
||||||
|
Description string
|
||||||
|
Version string
|
||||||
}{
|
}{
|
||||||
Timestamp: time.Now(),
|
Timestamp: time.Now(),
|
||||||
Doc: string(buf),
|
GeneratedTime: config.GeneratedTime,
|
||||||
Host: swagger.Host,
|
Doc: string(buf),
|
||||||
BasePath: swagger.BasePath,
|
Host: swagger.Host,
|
||||||
Schemes: swagger.Schemes,
|
PackageName: packageName,
|
||||||
Title: swagger.Info.Title,
|
BasePath: swagger.BasePath,
|
||||||
Description: swagger.Info.Description,
|
Schemes: swagger.Schemes,
|
||||||
Version: swagger.Info.Version,
|
Title: swagger.Info.Title,
|
||||||
|
Description: swagger.Info.Description,
|
||||||
|
Version: swagger.Info.Version,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -213,14 +236,13 @@ func (g *Gen) writeGoDoc(output io.Writer, swagger *spec.Swagger) error {
|
||||||
// write
|
// write
|
||||||
_, err = output.Write(code)
|
_, err = output.Write(code)
|
||||||
return err
|
return err
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var packageTemplate = `// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
|
var packageTemplate = `// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
|
||||||
// This file was generated by swaggo/swag at
|
// This file was generated by swaggo/swag{{ if .GeneratedTime }} at
|
||||||
// {{ .Timestamp }}
|
// {{ .Timestamp }}{{ end }}
|
||||||
|
|
||||||
package docs
|
package {{.PackageName}}
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
|
14
vendor/github.com/swaggo/swag/go.mod
generated
vendored
14
vendor/github.com/swaggo/swag/go.mod
generated
vendored
|
@ -4,11 +4,15 @@ require (
|
||||||
github.com/KyleBanks/depth v1.2.1
|
github.com/KyleBanks/depth v1.2.1
|
||||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
|
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
|
||||||
github.com/ghodss/yaml v1.0.0
|
github.com/ghodss/yaml v1.0.0
|
||||||
github.com/go-openapi/jsonreference v0.19.0
|
github.com/gin-gonic/gin v1.4.0
|
||||||
github.com/go-openapi/spec v0.19.0
|
github.com/go-openapi/jsonreference v0.19.3
|
||||||
github.com/stretchr/testify v1.3.0
|
github.com/go-openapi/spec v0.19.4
|
||||||
|
github.com/satori/go.uuid v1.2.0
|
||||||
|
github.com/stretchr/testify v1.4.0
|
||||||
github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14
|
github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14
|
||||||
github.com/swaggo/gin-swagger v1.2.0
|
github.com/swaggo/gin-swagger v1.2.0
|
||||||
github.com/urfave/cli v1.20.0
|
github.com/urfave/cli/v2 v2.1.1
|
||||||
golang.org/x/tools v0.0.0-20190611222205-d73e1c7e250b
|
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59
|
||||||
)
|
)
|
||||||
|
|
||||||
|
go 1.13
|
||||||
|
|
59
vendor/github.com/swaggo/swag/go.sum
generated
vendored
59
vendor/github.com/swaggo/swag/go.sum
generated
vendored
|
@ -1,74 +1,128 @@
|
||||||
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
|
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
|
||||||
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
|
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
|
||||||
github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4=
|
github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4=
|
||||||
github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
||||||
|
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
|
||||||
|
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
||||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
|
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
|
||||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
||||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
|
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
|
||||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY=
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
|
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
|
github.com/gin-contrib/gzip v0.0.1 h1:ezvKOL6jH+jlzdHNE4h9h8q8uMpDQjyl0NN0Jd7jozc=
|
||||||
github.com/gin-contrib/gzip v0.0.1/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w=
|
github.com/gin-contrib/gzip v0.0.1/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w=
|
||||||
github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
|
github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
|
||||||
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
|
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
|
||||||
|
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
|
||||||
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
||||||
github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y=
|
github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y=
|
||||||
|
github.com/gin-gonic/gin v1.4.0 h1:3tMoCCfM7ppqsR0ptz/wi1impNpT7/9wQtMZ8lr1mCQ=
|
||||||
github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM=
|
github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM=
|
||||||
github.com/go-openapi/jsonpointer v0.17.0 h1:nH6xp8XdXHx8dqveo0ZuJBluCO2qGrPbDNZ0dwoRHP0=
|
github.com/go-openapi/jsonpointer v0.17.0 h1:nH6xp8XdXHx8dqveo0ZuJBluCO2qGrPbDNZ0dwoRHP0=
|
||||||
github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
|
github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
|
||||||
|
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
|
||||||
|
github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w=
|
||||||
|
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
||||||
github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
|
github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
|
||||||
github.com/go-openapi/jsonreference v0.19.0 h1:BqWKpV1dFd+AuiKlgtddwVIFQsuMpxfBDBHGfM2yNpk=
|
github.com/go-openapi/jsonreference v0.19.0 h1:BqWKpV1dFd+AuiKlgtddwVIFQsuMpxfBDBHGfM2yNpk=
|
||||||
github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
|
github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
|
||||||
|
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
|
||||||
|
github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o=
|
||||||
|
github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
|
||||||
github.com/go-openapi/spec v0.19.0 h1:A4SZ6IWh3lnjH0rG0Z5lkxazMGBECtrZcbyYQi+64k4=
|
github.com/go-openapi/spec v0.19.0 h1:A4SZ6IWh3lnjH0rG0Z5lkxazMGBECtrZcbyYQi+64k4=
|
||||||
github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
|
github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
|
||||||
|
github.com/go-openapi/spec v0.19.4 h1:ixzUSnHTd6hCemgtAJgluaTSGYpLNpJY4mA2DIkdOAo=
|
||||||
|
github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
|
||||||
github.com/go-openapi/swag v0.17.0 h1:iqrgMg7Q7SvtbWLlltPrkMs0UBJI6oTSs79JFRUi880=
|
github.com/go-openapi/swag v0.17.0 h1:iqrgMg7Q7SvtbWLlltPrkMs0UBJI6oTSs79JFRUi880=
|
||||||
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
|
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
|
||||||
|
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
||||||
|
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
|
||||||
|
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||||
|
github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs=
|
||||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||||
|
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
|
||||||
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic=
|
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic=
|
||||||
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
|
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
|
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8=
|
||||||
|
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||||
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
|
github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
|
||||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
|
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
|
||||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
|
||||||
|
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
|
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
|
||||||
|
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||||
|
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
|
||||||
|
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||||
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
|
github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14 h1:PyYN9JH5jY9j6av01SpfRMb+1DWg/i3MbGOKPxJ2wjM=
|
||||||
github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14/go.mod h1:gxQT6pBGRuIGunNf/+tSOB5OHvguWi8Tbt82WOkf35E=
|
github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14/go.mod h1:gxQT6pBGRuIGunNf/+tSOB5OHvguWi8Tbt82WOkf35E=
|
||||||
|
github.com/swaggo/gin-swagger v1.2.0 h1:YskZXEiv51fjOMTsXrOetAjrMDfFaXD79PEoQBOe2W0=
|
||||||
github.com/swaggo/gin-swagger v1.2.0/go.mod h1:qlH2+W7zXGZkczuL+r2nEBR2JTT+/lX05Nn6vPhc7OI=
|
github.com/swaggo/gin-swagger v1.2.0/go.mod h1:qlH2+W7zXGZkczuL+r2nEBR2JTT+/lX05Nn6vPhc7OI=
|
||||||
github.com/swaggo/swag v1.5.1/go.mod h1:1Bl9F/ZBpVWh22nY0zmYyASPO1lI/zIwRDrpZU+tv8Y=
|
github.com/swaggo/swag v1.5.1/go.mod h1:1Bl9F/ZBpVWh22nY0zmYyASPO1lI/zIwRDrpZU+tv8Y=
|
||||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||||
|
github.com/ugorji/go v1.1.5-pre h1:jyJKFOSEbdOc2HODrf2qcCkYOdq7zzXqA9bhW5oV4fM=
|
||||||
github.com/ugorji/go v1.1.5-pre/go.mod h1:FwP/aQVg39TXzItUBMwnWp9T9gPQnXw4Poh4/oBQZ/0=
|
github.com/ugorji/go v1.1.5-pre/go.mod h1:FwP/aQVg39TXzItUBMwnWp9T9gPQnXw4Poh4/oBQZ/0=
|
||||||
github.com/ugorji/go/codec v0.0.0-20181022190402-e5e69e061d4f/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
github.com/ugorji/go/codec v0.0.0-20181022190402-e5e69e061d4f/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
||||||
|
github.com/ugorji/go/codec v1.1.5-pre h1:5YV9PsFAN+ndcCtTM7s60no7nY7eTG3LPtxhSwuxzCs=
|
||||||
github.com/ugorji/go/codec v1.1.5-pre/go.mod h1:tULtS6Gy1AE1yCENaw4Vb//HLH5njI2tfCQDUqRd8fI=
|
github.com/ugorji/go/codec v1.1.5-pre/go.mod h1:tULtS6Gy1AE1yCENaw4Vb//HLH5njI2tfCQDUqRd8fI=
|
||||||
github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
|
github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
|
||||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||||
|
github.com/urfave/cli/v2 v2.1.1 h1:Qt8FeAtxE/vfdrLmR3rxR6JRE0RoVmbXu8+6kZtYU4k=
|
||||||
|
github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190611141213-3f473d35a33a h1:+KkCgOMgnKSgenxTBoiwkMqTiouMIy/3o8RLdmSbGoY=
|
golang.org/x/net v0.0.0-20190611141213-3f473d35a33a h1:+KkCgOMgnKSgenxTBoiwkMqTiouMIy/3o8RLdmSbGoY=
|
||||||
golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
|
||||||
|
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae h1:xiXzMMEQdQcric9hXtr1QU98MHunKK7OTtsoU6bYWs4=
|
||||||
golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f h1:25KHgbfyiSm6vwQLbM3zZIe1v9p/3ea4Rz+nnM5K/i4=
|
||||||
|
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
@ -76,9 +130,14 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm
|
||||||
golang.org/x/tools v0.0.0-20190606050223-4d9ae51c2468/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
golang.org/x/tools v0.0.0-20190606050223-4d9ae51c2468/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
golang.org/x/tools v0.0.0-20190611222205-d73e1c7e250b h1:/mJ+GKieZA6hFDQGdWZrjj4AXPl5ylY+5HusG80roy0=
|
golang.org/x/tools v0.0.0-20190611222205-d73e1c7e250b h1:/mJ+GKieZA6hFDQGdWZrjj4AXPl5ylY+5HusG80roy0=
|
||||||
golang.org/x/tools v0.0.0-20190611222205-d73e1c7e250b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
golang.org/x/tools v0.0.0-20190611222205-d73e1c7e250b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59 h1:QjA/9ArTfVTLfEhClDCG7SGrZkZixxWpwNCDiwJfh88=
|
||||||
|
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM=
|
||||||
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
|
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
|
||||||
|
gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ=
|
||||||
gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y=
|
gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y=
|
||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
||||||
|
|
371
vendor/github.com/swaggo/swag/operation.go
generated
vendored
371
vendor/github.com/swaggo/swag/operation.go
generated
vendored
|
@ -9,6 +9,7 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -69,6 +70,12 @@ func (operation *Operation) ParseComment(comment string, astFile *ast.File) erro
|
||||||
switch lowerAttribute {
|
switch lowerAttribute {
|
||||||
case "@description":
|
case "@description":
|
||||||
operation.ParseDescriptionComment(lineRemainder)
|
operation.ParseDescriptionComment(lineRemainder)
|
||||||
|
case "@description.markdown":
|
||||||
|
commentInfo, err := getMarkdownForTag(lineRemainder, operation.parser.markdownFileDir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
operation.ParseDescriptionComment(string(commentInfo))
|
||||||
case "@summary":
|
case "@summary":
|
||||||
operation.Summary = lineRemainder
|
operation.Summary = lineRemainder
|
||||||
case "@id":
|
case "@id":
|
||||||
|
@ -141,9 +148,10 @@ func (operation *Operation) ParseParamComment(commentLine string, astFile *ast.F
|
||||||
|
|
||||||
// Detect refType
|
// Detect refType
|
||||||
objectType := "object"
|
objectType := "object"
|
||||||
if strings.HasPrefix(refType, "[]") == true {
|
if strings.HasPrefix(refType, "[]") {
|
||||||
objectType = "array"
|
objectType = "array"
|
||||||
refType = strings.TrimPrefix(refType, "[]")
|
refType = strings.TrimPrefix(refType, "[]")
|
||||||
|
refType = TransToValidSchemeType(refType)
|
||||||
} else if IsPrimitiveType(refType) ||
|
} else if IsPrimitiveType(refType) ||
|
||||||
paramType == "formData" && refType == "file" {
|
paramType == "formData" && refType == "file" {
|
||||||
objectType = "primitive"
|
objectType = "primitive"
|
||||||
|
@ -168,67 +176,132 @@ func (operation *Operation) ParseParamComment(commentLine string, astFile *ast.F
|
||||||
return fmt.Errorf("%s is not supported array type for %s", refType, paramType)
|
return fmt.Errorf("%s is not supported array type for %s", refType, paramType)
|
||||||
}
|
}
|
||||||
param.SimpleSchema.Type = "array"
|
param.SimpleSchema.Type = "array"
|
||||||
|
if operation.parser != nil {
|
||||||
|
param.CollectionFormat = TransToValidCollectionFormat(operation.parser.collectionFormatInQuery)
|
||||||
|
}
|
||||||
param.SimpleSchema.Items = &spec.Items{
|
param.SimpleSchema.Items = &spec.Items{
|
||||||
SimpleSchema: spec.SimpleSchema{
|
SimpleSchema: spec.SimpleSchema{
|
||||||
Type: refType,
|
Type: refType,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
case "object":
|
case "object":
|
||||||
return fmt.Errorf("%s is not supported type for %s", refType, paramType)
|
refType, typeSpec, err := operation.registerSchemaType(refType, astFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
structType, ok := typeSpec.Type.(*ast.StructType)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("%s is not supported type for %s", refType, paramType)
|
||||||
|
}
|
||||||
|
refSplit := strings.Split(refType, ".")
|
||||||
|
schema, err := operation.parser.parseStruct(refSplit[0], structType.Fields)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(schema.Properties) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
find := func(arr []string, target string) bool {
|
||||||
|
for _, str := range arr {
|
||||||
|
if str == target {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
orderedNames := make([]string, 0, len(schema.Properties))
|
||||||
|
for k := range schema.Properties {
|
||||||
|
orderedNames = append(orderedNames, k)
|
||||||
|
}
|
||||||
|
sort.Strings(orderedNames)
|
||||||
|
for _, name := range orderedNames {
|
||||||
|
prop := schema.Properties[name]
|
||||||
|
if len(prop.Type) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if prop.Type[0] == "array" &&
|
||||||
|
prop.Items.Schema != nil &&
|
||||||
|
len(prop.Items.Schema.Type) > 0 &&
|
||||||
|
IsSimplePrimitiveType(prop.Items.Schema.Type[0]) {
|
||||||
|
param = createParameter(paramType, prop.Description, name, prop.Type[0], find(schema.Required, name))
|
||||||
|
param.SimpleSchema.Type = prop.Type[0]
|
||||||
|
if operation.parser != nil && operation.parser.collectionFormatInQuery != "" && param.CollectionFormat == "" {
|
||||||
|
param.CollectionFormat = TransToValidCollectionFormat(operation.parser.collectionFormatInQuery)
|
||||||
|
}
|
||||||
|
param.SimpleSchema.Items = &spec.Items{
|
||||||
|
SimpleSchema: spec.SimpleSchema{
|
||||||
|
Type: prop.Items.Schema.Type[0],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
} else if IsSimplePrimitiveType(prop.Type[0]) {
|
||||||
|
param = createParameter(paramType, prop.Description, name, prop.Type[0], find(schema.Required, name))
|
||||||
|
} else {
|
||||||
|
Println(fmt.Sprintf("skip field [%s] in %s is not supported type for %s", name, refType, paramType))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
param.Nullable = prop.Nullable
|
||||||
|
param.Format = prop.Format
|
||||||
|
param.Default = prop.Default
|
||||||
|
param.Example = prop.Example
|
||||||
|
param.Extensions = prop.Extensions
|
||||||
|
param.CommonValidations.Maximum = prop.Maximum
|
||||||
|
param.CommonValidations.Minimum = prop.Minimum
|
||||||
|
param.CommonValidations.ExclusiveMaximum = prop.ExclusiveMaximum
|
||||||
|
param.CommonValidations.ExclusiveMinimum = prop.ExclusiveMinimum
|
||||||
|
param.CommonValidations.MaxLength = prop.MaxLength
|
||||||
|
param.CommonValidations.MinLength = prop.MinLength
|
||||||
|
param.CommonValidations.Pattern = prop.Pattern
|
||||||
|
param.CommonValidations.MaxItems = prop.MaxItems
|
||||||
|
param.CommonValidations.MinItems = prop.MinItems
|
||||||
|
param.CommonValidations.UniqueItems = prop.UniqueItems
|
||||||
|
param.CommonValidations.MultipleOf = prop.MultipleOf
|
||||||
|
param.CommonValidations.Enum = prop.Enum
|
||||||
|
operation.Operation.Parameters = append(operation.Operation.Parameters, param)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
case "body":
|
case "body":
|
||||||
switch objectType {
|
switch objectType {
|
||||||
case "primitive":
|
case "primitive":
|
||||||
param.Schema.Type = spec.StringOrArray{refType}
|
param.Schema.Type = spec.StringOrArray{refType}
|
||||||
case "array":
|
case "array":
|
||||||
param.Schema.Items = &spec.SchemaOrArray{
|
refType = "[]" + refType
|
||||||
Schema: &spec.Schema{
|
fallthrough
|
||||||
SchemaProps: spec.SchemaProps{},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
// Arrau of Primitive or Object
|
|
||||||
if IsPrimitiveType(refType) {
|
|
||||||
param.Schema.Items.Schema.Type = spec.StringOrArray{refType}
|
|
||||||
} else {
|
|
||||||
if err := operation.registerSchemaType(refType, astFile); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
param.Schema.Items.Schema.Ref = spec.Ref{Ref: jsonreference.MustCreateRef("#/definitions/" + refType)}
|
|
||||||
}
|
|
||||||
case "object":
|
case "object":
|
||||||
if err := operation.registerSchemaType(refType, astFile); err != nil {
|
schema, err := operation.parseObjectSchema(refType, astFile)
|
||||||
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
param.Schema.Type = spec.StringOrArray{objectType}
|
param.Schema = schema
|
||||||
param.Schema.Ref = spec.Ref{
|
|
||||||
Ref: jsonreference.MustCreateRef("#/definitions/" + refType),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("%s is not supported paramType", paramType)
|
return fmt.Errorf("%s is not supported paramType", paramType)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := operation.parseAndExtractionParamAttribute(commentLine, refType, ¶m); err != nil {
|
if err := operation.parseAndExtractionParamAttribute(commentLine, objectType, refType, ¶m); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
operation.Operation.Parameters = append(operation.Operation.Parameters, param)
|
operation.Operation.Parameters = append(operation.Operation.Parameters, param)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (operation *Operation) registerSchemaType(schemaType string, astFile *ast.File) error {
|
func (operation *Operation) registerSchemaType(schemaType string, astFile *ast.File) (string, *ast.TypeSpec, error) {
|
||||||
refSplit := strings.Split(schemaType, ".")
|
if !strings.ContainsRune(schemaType, '.') {
|
||||||
if len(refSplit) != 2 {
|
if astFile == nil {
|
||||||
return nil
|
return schemaType, nil, fmt.Errorf("no package name for type %s", schemaType)
|
||||||
|
}
|
||||||
|
schemaType = fullTypeName(astFile.Name.String(), schemaType)
|
||||||
}
|
}
|
||||||
|
refSplit := strings.Split(schemaType, ".")
|
||||||
pkgName := refSplit[0]
|
pkgName := refSplit[0]
|
||||||
typeName := refSplit[1]
|
typeName := refSplit[1]
|
||||||
if typeSpec, ok := operation.parser.TypeDefinitions[pkgName][typeName]; ok {
|
if typeSpec, ok := operation.parser.TypeDefinitions[pkgName][typeName]; ok {
|
||||||
operation.parser.registerTypes[schemaType] = typeSpec
|
operation.parser.registerTypes[schemaType] = typeSpec
|
||||||
return nil
|
return schemaType, typeSpec, nil
|
||||||
}
|
}
|
||||||
var typeSpec *ast.TypeSpec
|
var typeSpec *ast.TypeSpec
|
||||||
if astFile == nil {
|
if astFile == nil {
|
||||||
return fmt.Errorf("can not register schema type: %q reason: astFile == nil", schemaType)
|
return schemaType, nil, fmt.Errorf("can not register schema type: %q reason: astFile == nil", schemaType)
|
||||||
}
|
}
|
||||||
for _, imp := range astFile.Imports {
|
for _, imp := range astFile.Imports {
|
||||||
if imp.Name != nil && imp.Name.Name == pkgName { // the import had an alias that matched
|
if imp.Name != nil && imp.Name.Name == pkgName { // the import had an alias that matched
|
||||||
|
@ -239,14 +312,14 @@ func (operation *Operation) registerSchemaType(schemaType string, astFile *ast.F
|
||||||
var err error
|
var err error
|
||||||
typeSpec, err = findTypeDef(impPath, typeName)
|
typeSpec, err = findTypeDef(impPath, typeName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("can not find type def: %q error: %s", schemaType, err)
|
return schemaType, nil, fmt.Errorf("can not find type def: %q error: %s", schemaType, err)
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if typeSpec == nil {
|
if typeSpec == nil {
|
||||||
return fmt.Errorf("can not find schema type: %q", schemaType)
|
return schemaType, nil, fmt.Errorf("can not find schema type: %q", schemaType)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, ok := operation.parser.TypeDefinitions[pkgName]; !ok {
|
if _, ok := operation.parser.TypeDefinitions[pkgName]; !ok {
|
||||||
|
@ -255,27 +328,29 @@ func (operation *Operation) registerSchemaType(schemaType string, astFile *ast.F
|
||||||
|
|
||||||
operation.parser.TypeDefinitions[pkgName][typeName] = typeSpec
|
operation.parser.TypeDefinitions[pkgName][typeName] = typeSpec
|
||||||
operation.parser.registerTypes[schemaType] = typeSpec
|
operation.parser.registerTypes[schemaType] = typeSpec
|
||||||
return nil
|
return schemaType, typeSpec, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var regexAttributes = map[string]*regexp.Regexp{
|
var regexAttributes = map[string]*regexp.Regexp{
|
||||||
// for Enums(A, B)
|
// for Enums(A, B)
|
||||||
"enums": regexp.MustCompile(`(?i)enums\(.*\)`),
|
"enums": regexp.MustCompile(`(?i)\s+enums\(.*\)`),
|
||||||
// for Minimum(0)
|
// for Minimum(0)
|
||||||
"maxinum": regexp.MustCompile(`(?i)maxinum\(.*\)`),
|
"maxinum": regexp.MustCompile(`(?i)\s+maxinum\(.*\)`),
|
||||||
// for Maximum(0)
|
// for Maximum(0)
|
||||||
"mininum": regexp.MustCompile(`(?i)mininum\(.*\)`),
|
"mininum": regexp.MustCompile(`(?i)\s+mininum\(.*\)`),
|
||||||
// for Maximum(0)
|
// for Maximum(0)
|
||||||
"default": regexp.MustCompile(`(?i)default\(.*\)`),
|
"default": regexp.MustCompile(`(?i)\s+default\(.*\)`),
|
||||||
// for minlength(0)
|
// for minlength(0)
|
||||||
"minlength": regexp.MustCompile(`(?i)minlength\(.*\)`),
|
"minlength": regexp.MustCompile(`(?i)\s+minlength\(.*\)`),
|
||||||
// for maxlength(0)
|
// for maxlength(0)
|
||||||
"maxlength": regexp.MustCompile(`(?i)maxlength\(.*\)`),
|
"maxlength": regexp.MustCompile(`(?i)\s+maxlength\(.*\)`),
|
||||||
// for format(email)
|
// for format(email)
|
||||||
"format": regexp.MustCompile(`(?i)format\(.*\)`),
|
"format": regexp.MustCompile(`(?i)\s+format\(.*\)`),
|
||||||
|
// for collectionFormat(csv)
|
||||||
|
"collectionFormat": regexp.MustCompile(`(?i)\s+collectionFormat\(.*\)`),
|
||||||
}
|
}
|
||||||
|
|
||||||
func (operation *Operation) parseAndExtractionParamAttribute(commentLine, schemaType string, param *spec.Parameter) error {
|
func (operation *Operation) parseAndExtractionParamAttribute(commentLine, objectType, schemaType string, param *spec.Parameter) error {
|
||||||
schemaType = TransToValidSchemeType(schemaType)
|
schemaType = TransToValidSchemeType(schemaType)
|
||||||
for attrKey, re := range regexAttributes {
|
for attrKey, re := range regexAttributes {
|
||||||
attr, err := findAttr(re, commentLine)
|
attr, err := findAttr(re, commentLine)
|
||||||
|
@ -320,8 +395,13 @@ func (operation *Operation) parseAndExtractionParamAttribute(commentLine, schema
|
||||||
param.MinLength = &n
|
param.MinLength = &n
|
||||||
case "format":
|
case "format":
|
||||||
param.Format = attr
|
param.Format = attr
|
||||||
|
case "collectionFormat":
|
||||||
|
n, err := setCollectionFormatParam(attrKey, objectType, attr, commentLine)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
param.CollectionFormat = n
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -371,6 +451,13 @@ func setEnumParam(attr, schemaType string, param *spec.Parameter) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setCollectionFormatParam(name, schemaType, attr, commentLine string) (string, error) {
|
||||||
|
if schemaType != "array" {
|
||||||
|
return "", fmt.Errorf("%s is attribute to set to an array. comment=%s got=%s", name, commentLine, schemaType)
|
||||||
|
}
|
||||||
|
return TransToValidCollectionFormat(attr), nil
|
||||||
|
}
|
||||||
|
|
||||||
// defineType enum value define the type (object and array unsupported)
|
// defineType enum value define the type (object and array unsupported)
|
||||||
func defineType(schemaType string, value string) (interface{}, error) {
|
func defineType(schemaType string, value string) (interface{}, error) {
|
||||||
schemaType = TransToValidSchemeType(schemaType)
|
schemaType = TransToValidSchemeType(schemaType)
|
||||||
|
@ -437,7 +524,7 @@ func parseMimeTypeList(mimeTypeList string, typeList *[]string, format string) e
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var routerPattern = regexp.MustCompile(`([\w\.\/\-{}\+]+)[^\[]+\[([^\]]+)`)
|
var routerPattern = regexp.MustCompile(`^(/[\w\.\/\-{}\+:]*)[[:blank:]]+\[(\w+)]`)
|
||||||
|
|
||||||
// ParseRouterComment parses comment for gived `router` comment string.
|
// ParseRouterComment parses comment for gived `router` comment string.
|
||||||
func (operation *Operation) ParseRouterComment(commentLine string) error {
|
func (operation *Operation) ParseRouterComment(commentLine string) error {
|
||||||
|
@ -536,7 +623,155 @@ func findTypeDef(importPath, typeName string) (*ast.TypeSpec, error) {
|
||||||
return nil, fmt.Errorf("type spec not found")
|
return nil, fmt.Errorf("type spec not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
var responsePattern = regexp.MustCompile(`([\d]+)[\s]+([\w\{\}]+)[\s]+([\w\-\.\/]+)[^"]*(.*)?`)
|
var responsePattern = regexp.MustCompile(`([\d]+)[\s]+([\w\{\}]+)[\s]+([\w\-\.\/\{\}=,\[\]]+)[^"]*(.*)?`)
|
||||||
|
|
||||||
|
//RepsonseType{data1=Type1,data2=Type2}
|
||||||
|
var combinedPattern = regexp.MustCompile(`^([\w\-\.\/\[\]]+)\{(.*)\}$`)
|
||||||
|
|
||||||
|
func (operation *Operation) parseObjectSchema(refType string, astFile *ast.File) (*spec.Schema, error) {
|
||||||
|
switch {
|
||||||
|
case refType == "interface{}":
|
||||||
|
return &spec.Schema{SchemaProps: spec.SchemaProps{Type: []string{"object"}}}, nil
|
||||||
|
case IsGolangPrimitiveType(refType):
|
||||||
|
refType = TransToValidSchemeType(refType)
|
||||||
|
return &spec.Schema{SchemaProps: spec.SchemaProps{Type: []string{refType}}}, nil
|
||||||
|
case IsPrimitiveType(refType):
|
||||||
|
return &spec.Schema{SchemaProps: spec.SchemaProps{Type: []string{refType}}}, nil
|
||||||
|
case strings.HasPrefix(refType, "[]"):
|
||||||
|
schema, err := operation.parseObjectSchema(refType[2:], astFile)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &spec.Schema{SchemaProps: spec.SchemaProps{
|
||||||
|
Type: []string{"array"},
|
||||||
|
Items: &spec.SchemaOrArray{Schema: schema}},
|
||||||
|
}, nil
|
||||||
|
case strings.HasPrefix(refType, "map["):
|
||||||
|
//ignore key type
|
||||||
|
idx := strings.Index(refType, "]")
|
||||||
|
if idx < 0 {
|
||||||
|
return nil, fmt.Errorf("invalid type: %s", refType)
|
||||||
|
}
|
||||||
|
refType = refType[idx+1:]
|
||||||
|
var valueSchema spec.SchemaOrBool
|
||||||
|
if refType == "interface{}" {
|
||||||
|
valueSchema.Allows = true
|
||||||
|
} else {
|
||||||
|
schema, err := operation.parseObjectSchema(refType, astFile)
|
||||||
|
if err != nil {
|
||||||
|
return &spec.Schema{}, err
|
||||||
|
}
|
||||||
|
valueSchema.Schema = schema
|
||||||
|
}
|
||||||
|
return &spec.Schema{
|
||||||
|
SchemaProps: spec.SchemaProps{
|
||||||
|
Type: []string{"object"},
|
||||||
|
AdditionalProperties: &valueSchema,
|
||||||
|
},
|
||||||
|
}, nil
|
||||||
|
case strings.Contains(refType, "{"):
|
||||||
|
return operation.parseResponseCombinedObjectSchema(refType, astFile)
|
||||||
|
default:
|
||||||
|
if operation.parser != nil { // checking refType has existing in 'TypeDefinitions'
|
||||||
|
refNewType, typeSpec, err := operation.registerSchemaType(refType, astFile)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
refType = TypeDocName(refNewType, typeSpec)
|
||||||
|
}
|
||||||
|
return &spec.Schema{SchemaProps: spec.SchemaProps{Ref: spec.Ref{
|
||||||
|
Ref: jsonreference.MustCreateRef("#/definitions/" + refType),
|
||||||
|
}}}, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (operation *Operation) parseResponseCombinedObjectSchema(refType string, astFile *ast.File) (*spec.Schema, error) {
|
||||||
|
matches := combinedPattern.FindStringSubmatch(refType)
|
||||||
|
if len(matches) != 3 {
|
||||||
|
return nil, fmt.Errorf("invalid type: %s", refType)
|
||||||
|
}
|
||||||
|
refType = matches[1]
|
||||||
|
schema, err := operation.parseObjectSchema(refType, astFile)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
parseFields := func(s string) []string {
|
||||||
|
n := 0
|
||||||
|
return strings.FieldsFunc(s, func(r rune) bool {
|
||||||
|
if r == '{' {
|
||||||
|
n++
|
||||||
|
return false
|
||||||
|
} else if r == '}' {
|
||||||
|
n--
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return r == ',' && n == 0
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fields := parseFields(matches[2])
|
||||||
|
props := map[string]spec.Schema{}
|
||||||
|
for _, field := range fields {
|
||||||
|
if matches := strings.SplitN(field, "=", 2); len(matches) == 2 {
|
||||||
|
if strings.HasPrefix(matches[1], "[]") {
|
||||||
|
itemSchema, err := operation.parseObjectSchema(matches[1][2:], astFile)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
props[matches[0]] = spec.Schema{SchemaProps: spec.SchemaProps{
|
||||||
|
Type: []string{"array"},
|
||||||
|
Items: &spec.SchemaOrArray{Schema: itemSchema}},
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
schema, err := operation.parseObjectSchema(matches[1], astFile)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
props[matches[0]] = *schema
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(props) == 0 {
|
||||||
|
return schema, nil
|
||||||
|
}
|
||||||
|
return &spec.Schema{
|
||||||
|
SchemaProps: spec.SchemaProps{
|
||||||
|
AllOf: []spec.Schema{
|
||||||
|
*schema,
|
||||||
|
{
|
||||||
|
SchemaProps: spec.SchemaProps{
|
||||||
|
Type: []string{"object"},
|
||||||
|
Properties: props,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (operation *Operation) parseResponseSchema(schemaType, refType string, astFile *ast.File) (*spec.Schema, error) {
|
||||||
|
switch schemaType {
|
||||||
|
case "object":
|
||||||
|
if !strings.HasPrefix(refType, "[]") {
|
||||||
|
return operation.parseObjectSchema(refType, astFile)
|
||||||
|
}
|
||||||
|
refType = refType[2:]
|
||||||
|
fallthrough
|
||||||
|
case "array":
|
||||||
|
schema, err := operation.parseObjectSchema(refType, astFile)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &spec.Schema{SchemaProps: spec.SchemaProps{
|
||||||
|
Type: []string{"array"},
|
||||||
|
Items: &spec.SchemaOrArray{Schema: schema}},
|
||||||
|
}, nil
|
||||||
|
default:
|
||||||
|
return &spec.Schema{SchemaProps: spec.SchemaProps{Type: []string{schemaType}}}, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ParseResponseComment parses comment for given `response` comment string.
|
// ParseResponseComment parses comment for given `response` comment string.
|
||||||
func (operation *Operation) ParseResponseComment(commentLine string, astFile *ast.File) error {
|
func (operation *Operation) ParseResponseComment(commentLine string, astFile *ast.File) error {
|
||||||
|
@ -550,59 +785,18 @@ func (operation *Operation) ParseResponseComment(commentLine string, astFile *as
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
response := spec.Response{}
|
|
||||||
|
|
||||||
code, _ := strconv.Atoi(matches[1])
|
code, _ := strconv.Atoi(matches[1])
|
||||||
|
|
||||||
responseDescription := strings.Trim(matches[4], "\"")
|
responseDescription := strings.Trim(matches[4], "\"")
|
||||||
if responseDescription == "" {
|
if responseDescription == "" {
|
||||||
responseDescription = http.StatusText(code)
|
responseDescription = http.StatusText(code)
|
||||||
}
|
}
|
||||||
response.Description = responseDescription
|
|
||||||
|
|
||||||
schemaType := strings.Trim(matches[2], "{}")
|
schemaType := strings.Trim(matches[2], "{}")
|
||||||
refType := matches[3]
|
refType := matches[3]
|
||||||
|
schema, err := operation.parseResponseSchema(schemaType, refType, astFile)
|
||||||
if !IsGolangPrimitiveType(refType) && !strings.Contains(refType, ".") {
|
if err != nil {
|
||||||
currentPkgName := astFile.Name.String()
|
return err
|
||||||
refType = currentPkgName + "." + refType
|
|
||||||
}
|
|
||||||
|
|
||||||
if operation.parser != nil { // checking refType has existing in 'TypeDefinitions'
|
|
||||||
if err := operation.registerSchemaType(refType, astFile); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// so we have to know all type in app
|
|
||||||
response.Schema = &spec.Schema{SchemaProps: spec.SchemaProps{Type: []string{schemaType}}}
|
|
||||||
|
|
||||||
if schemaType == "object" {
|
|
||||||
response.Schema.SchemaProps = spec.SchemaProps{}
|
|
||||||
response.Schema.Ref = spec.Ref{
|
|
||||||
Ref: jsonreference.MustCreateRef("#/definitions/" + refType),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if schemaType == "array" {
|
|
||||||
refType = TransToValidSchemeType(refType)
|
|
||||||
if IsPrimitiveType(refType) {
|
|
||||||
response.Schema.Items = &spec.SchemaOrArray{
|
|
||||||
Schema: &spec.Schema{
|
|
||||||
SchemaProps: spec.SchemaProps{
|
|
||||||
Type: spec.StringOrArray{refType},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
response.Schema.Items = &spec.SchemaOrArray{
|
|
||||||
Schema: &spec.Schema{
|
|
||||||
SchemaProps: spec.SchemaProps{
|
|
||||||
Ref: spec.Ref{Ref: jsonreference.MustCreateRef("#/definitions/" + refType)},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if operation.Responses == nil {
|
if operation.Responses == nil {
|
||||||
|
@ -613,8 +807,9 @@ func (operation *Operation) ParseResponseComment(commentLine string, astFile *as
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
operation.Responses.StatusCodeResponses[code] = response
|
operation.Responses.StatusCodeResponses[code] = spec.Response{
|
||||||
|
ResponseProps: spec.ResponseProps{Schema: schema, Description: responseDescription},
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
475
vendor/github.com/swaggo/swag/parser.go
generated
vendored
475
vendor/github.com/swaggo/swag/parser.go
generated
vendored
|
@ -11,7 +11,6 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path"
|
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"reflect"
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
|
@ -46,6 +45,9 @@ type Parser struct {
|
||||||
// TypeDefinitions is a map that stores [package name][type name][*ast.TypeSpec]
|
// TypeDefinitions is a map that stores [package name][type name][*ast.TypeSpec]
|
||||||
TypeDefinitions map[string]map[string]*ast.TypeSpec
|
TypeDefinitions map[string]map[string]*ast.TypeSpec
|
||||||
|
|
||||||
|
// ImportAliases is map that stores [import name][import package name][*ast.ImportSpec]
|
||||||
|
ImportAliases map[string]map[string]*ast.ImportSpec
|
||||||
|
|
||||||
// CustomPrimitiveTypes is a map that stores custom primitive types to actual golang types [type name][string]
|
// CustomPrimitiveTypes is a map that stores custom primitive types to actual golang types [type name][string]
|
||||||
CustomPrimitiveTypes map[string]string
|
CustomPrimitiveTypes map[string]string
|
||||||
|
|
||||||
|
@ -59,11 +61,20 @@ type Parser struct {
|
||||||
// ParseDependencies whether swag should be parse outside dependency folder
|
// ParseDependencies whether swag should be parse outside dependency folder
|
||||||
ParseDependency bool
|
ParseDependency bool
|
||||||
|
|
||||||
|
// ParseInternal whether swag should parse internal packages
|
||||||
|
ParseInternal bool
|
||||||
|
|
||||||
// structStack stores full names of the structures that were already parsed or are being parsed now
|
// structStack stores full names of the structures that were already parsed or are being parsed now
|
||||||
structStack []string
|
structStack []string
|
||||||
|
|
||||||
// markdownFileDir holds the path to the folder, where markdown files are stored
|
// markdownFileDir holds the path to the folder, where markdown files are stored
|
||||||
markdownFileDir string
|
markdownFileDir string
|
||||||
|
|
||||||
|
// collectionFormatInQuery set the default collectionFormat otherwise then 'csv' for array in query params
|
||||||
|
collectionFormatInQuery string
|
||||||
|
|
||||||
|
// excludes excludes dirs and files in SearchDir
|
||||||
|
excludes map[string]bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new Parser with default properties.
|
// New creates a new Parser with default properties.
|
||||||
|
@ -85,8 +96,10 @@ func New(options ...func(*Parser)) *Parser {
|
||||||
},
|
},
|
||||||
files: make(map[string]*ast.File),
|
files: make(map[string]*ast.File),
|
||||||
TypeDefinitions: make(map[string]map[string]*ast.TypeSpec),
|
TypeDefinitions: make(map[string]map[string]*ast.TypeSpec),
|
||||||
|
ImportAliases: make(map[string]map[string]*ast.ImportSpec),
|
||||||
CustomPrimitiveTypes: make(map[string]string),
|
CustomPrimitiveTypes: make(map[string]string),
|
||||||
registerTypes: make(map[string]*ast.TypeSpec),
|
registerTypes: make(map[string]*ast.TypeSpec),
|
||||||
|
excludes: make(map[string]bool),
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, option := range options {
|
for _, option := range options {
|
||||||
|
@ -103,6 +116,19 @@ func SetMarkdownFileDirectory(directoryPath string) func(*Parser) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetExcludedDirsAndFiles sets directories and files to be excluded when searching
|
||||||
|
func SetExcludedDirsAndFiles(excludes string) func(*Parser) {
|
||||||
|
return func(p *Parser) {
|
||||||
|
for _, f := range strings.Split(excludes, ",") {
|
||||||
|
f = strings.TrimSpace(f)
|
||||||
|
if f != "" {
|
||||||
|
f = filepath.Clean(f)
|
||||||
|
p.excludes[f] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ParseAPI parses general api info for given searchDir and mainAPIFile
|
// ParseAPI parses general api info for given searchDir and mainAPIFile
|
||||||
func (parser *Parser) ParseAPI(searchDir string, mainAPIFile string) error {
|
func (parser *Parser) ParseAPI(searchDir string, mainAPIFile string) error {
|
||||||
Printf("Generate general API Info, search dir:%s", searchDir)
|
Printf("Generate general API Info, search dir:%s", searchDir)
|
||||||
|
@ -112,6 +138,7 @@ func (parser *Parser) ParseAPI(searchDir string, mainAPIFile string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
var t depth.Tree
|
var t depth.Tree
|
||||||
|
t.ResolveInternal = true
|
||||||
|
|
||||||
absMainAPIFilePath, err := filepath.Abs(filepath.Join(searchDir, mainAPIFile))
|
absMainAPIFilePath, err := filepath.Abs(filepath.Join(searchDir, mainAPIFile))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -119,7 +146,7 @@ func (parser *Parser) ParseAPI(searchDir string, mainAPIFile string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if parser.ParseDependency {
|
if parser.ParseDependency {
|
||||||
pkgName, err := getPkgName(path.Dir(absMainAPIFilePath))
|
pkgName, err := getPkgName(filepath.Dir(absMainAPIFilePath))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -295,7 +322,8 @@ func (parser *Parser) ParseGeneralAPIInfo(mainAPIFile string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
securityMap[value] = securitySchemeOAuth2AccessToken(attrMap["@authorizationurl"], attrMap["@tokenurl"], scopes)
|
securityMap[value] = securitySchemeOAuth2AccessToken(attrMap["@authorizationurl"], attrMap["@tokenurl"], scopes)
|
||||||
|
case "@query.collection.format":
|
||||||
|
parser.collectionFormatInQuery = value
|
||||||
default:
|
default:
|
||||||
prefixExtension := "@x-"
|
prefixExtension := "@x-"
|
||||||
if len(attribute) > 5 { // Prefix extension + 1 char + 1 space + 1 char
|
if len(attribute) > 5 { // Prefix extension + 1 char + 1 space + 1 char
|
||||||
|
@ -512,7 +540,8 @@ func (parser *Parser) ParseType(astFile *ast.File) {
|
||||||
typeName := fmt.Sprintf("%v", typeSpec.Type)
|
typeName := fmt.Sprintf("%v", typeSpec.Type)
|
||||||
// check if its a custom primitive type
|
// check if its a custom primitive type
|
||||||
if IsGolangPrimitiveType(typeName) {
|
if IsGolangPrimitiveType(typeName) {
|
||||||
parser.CustomPrimitiveTypes[typeSpec.Name.String()] = TransToValidSchemeType(typeName)
|
var typeSpecFullName = fmt.Sprintf("%s.%s", astFile.Name.String(), typeSpec.Name.String())
|
||||||
|
parser.CustomPrimitiveTypes[typeSpecFullName] = TransToValidSchemeType(typeName)
|
||||||
} else {
|
} else {
|
||||||
parser.TypeDefinitions[astFile.Name.String()][typeSpec.Name.String()] = typeSpec
|
parser.TypeDefinitions[astFile.Name.String()][typeSpec.Name.String()] = typeSpec
|
||||||
}
|
}
|
||||||
|
@ -521,6 +550,23 @@ func (parser *Parser) ParseType(astFile *ast.File) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, importSpec := range astFile.Imports {
|
||||||
|
if importSpec.Name == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
alias := importSpec.Name.Name
|
||||||
|
|
||||||
|
if _, ok := parser.ImportAliases[alias]; !ok {
|
||||||
|
parser.ImportAliases[alias] = make(map[string]*ast.ImportSpec)
|
||||||
|
}
|
||||||
|
|
||||||
|
importParts := strings.Split(strings.Trim(importSpec.Path.Value, "\""), "/")
|
||||||
|
importPkgName := importParts[len(importParts)-1]
|
||||||
|
|
||||||
|
parser.ImportAliases[alias][importPkgName] = importSpec
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (parser *Parser) isInStructStack(refTypeName string) bool {
|
func (parser *Parser) isInStructStack(refTypeName string) bool {
|
||||||
|
@ -557,7 +603,7 @@ func (parser *Parser) parseDefinitions() error {
|
||||||
// given name and package, and populates swagger schema definitions registry
|
// given name and package, and populates swagger schema definitions registry
|
||||||
// with a schema for the given type
|
// with a schema for the given type
|
||||||
func (parser *Parser) ParseDefinition(pkgName, typeName string, typeSpec *ast.TypeSpec) error {
|
func (parser *Parser) ParseDefinition(pkgName, typeName string, typeSpec *ast.TypeSpec) error {
|
||||||
refTypeName := fullTypeName(pkgName, typeName)
|
refTypeName := TypeDocName(pkgName, typeSpec)
|
||||||
|
|
||||||
if typeSpec == nil {
|
if typeSpec == nil {
|
||||||
Println("Skipping '" + refTypeName + "', pkg '" + pkgName + "' not found, try add flag --parseDependency or --parseVendor.")
|
Println("Skipping '" + refTypeName + "', pkg '" + pkgName + "' not found, try add flag --parseDependency or --parseVendor.")
|
||||||
|
@ -581,7 +627,7 @@ func (parser *Parser) ParseDefinition(pkgName, typeName string, typeSpec *ast.Ty
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
parser.swagger.Definitions[refTypeName] = schema
|
parser.swagger.Definitions[refTypeName] = *schema
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -605,9 +651,7 @@ func (parser *Parser) collectRequiredFields(pkgName string, properties map[strin
|
||||||
tspec := parser.TypeDefinitions[pkgName][tname]
|
tspec := parser.TypeDefinitions[pkgName][tname]
|
||||||
parser.ParseDefinition(pkgName, tname, tspec)
|
parser.ParseDefinition(pkgName, tname, tspec)
|
||||||
}
|
}
|
||||||
if tname != "object" {
|
requiredFields = append(requiredFields, prop.SchemaProps.Required...)
|
||||||
requiredFields = append(requiredFields, prop.SchemaProps.Required...)
|
|
||||||
}
|
|
||||||
properties[k] = prop
|
properties[k] = prop
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -629,28 +673,44 @@ func fullTypeName(pkgName, typeName string) string {
|
||||||
|
|
||||||
// parseTypeExpr parses given type expression that corresponds to the type under
|
// parseTypeExpr parses given type expression that corresponds to the type under
|
||||||
// given name and package, and returns swagger schema for it.
|
// given name and package, and returns swagger schema for it.
|
||||||
func (parser *Parser) parseTypeExpr(pkgName, typeName string, typeExpr ast.Expr) (spec.Schema, error) {
|
func (parser *Parser) parseTypeExpr(pkgName, typeName string, typeExpr ast.Expr) (*spec.Schema, error) {
|
||||||
//TODO: return pointer to spec.Schema
|
|
||||||
|
|
||||||
switch expr := typeExpr.(type) {
|
switch expr := typeExpr.(type) {
|
||||||
// type Foo struct {...}
|
// type Foo struct {...}
|
||||||
case *ast.StructType:
|
case *ast.StructType:
|
||||||
refTypeName := fullTypeName(pkgName, typeName)
|
if typedef, ok := parser.TypeDefinitions[pkgName][typeName]; ok {
|
||||||
if schema, isParsed := parser.swagger.Definitions[refTypeName]; isParsed {
|
refTypeName := TypeDocName(pkgName, typedef)
|
||||||
return schema, nil
|
if schema, isParsed := parser.swagger.Definitions[refTypeName]; isParsed {
|
||||||
|
return &schema, nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return parser.parseStruct(pkgName, expr.Fields)
|
return parser.parseStruct(pkgName, expr.Fields)
|
||||||
|
|
||||||
// type Foo Baz
|
// type Foo Baz
|
||||||
case *ast.Ident:
|
case *ast.Ident:
|
||||||
|
if IsGolangPrimitiveType(expr.Name) {
|
||||||
|
return &spec.Schema{
|
||||||
|
SchemaProps: spec.SchemaProps{
|
||||||
|
Type: spec.StringOrArray{TransToValidSchemeType(expr.Name)},
|
||||||
|
},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
refTypeName := fullTypeName(pkgName, expr.Name)
|
refTypeName := fullTypeName(pkgName, expr.Name)
|
||||||
if _, isParsed := parser.swagger.Definitions[refTypeName]; !isParsed {
|
if typedef, ok := parser.TypeDefinitions[pkgName][expr.Name]; ok {
|
||||||
if typedef, ok := parser.TypeDefinitions[pkgName][expr.Name]; ok {
|
refTypeName = TypeDocName(pkgName, typedef)
|
||||||
|
if _, isParsed := parser.swagger.Definitions[refTypeName]; !isParsed {
|
||||||
parser.ParseDefinition(pkgName, expr.Name, typedef)
|
parser.ParseDefinition(pkgName, expr.Name, typedef)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return parser.swagger.Definitions[refTypeName], nil
|
|
||||||
|
return &spec.Schema{
|
||||||
|
SchemaProps: spec.SchemaProps{
|
||||||
|
Ref: spec.Ref{
|
||||||
|
Ref: jsonreference.MustCreateRef("#/definitions/" + refTypeName),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}, nil
|
||||||
|
|
||||||
// type Foo *Baz
|
// type Foo *Baz
|
||||||
case *ast.StarExpr:
|
case *ast.StarExpr:
|
||||||
|
@ -660,13 +720,13 @@ func (parser *Parser) parseTypeExpr(pkgName, typeName string, typeExpr ast.Expr)
|
||||||
case *ast.ArrayType:
|
case *ast.ArrayType:
|
||||||
itemSchema, err := parser.parseTypeExpr(pkgName, "", expr.Elt)
|
itemSchema, err := parser.parseTypeExpr(pkgName, "", expr.Elt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return spec.Schema{}, err
|
return &spec.Schema{}, err
|
||||||
}
|
}
|
||||||
return spec.Schema{
|
return &spec.Schema{
|
||||||
SchemaProps: spec.SchemaProps{
|
SchemaProps: spec.SchemaProps{
|
||||||
Type: []string{"array"},
|
Type: []string{"array"},
|
||||||
Items: &spec.SchemaOrArray{
|
Items: &spec.SchemaOrArray{
|
||||||
Schema: &itemSchema,
|
Schema: itemSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
|
@ -674,28 +734,25 @@ func (parser *Parser) parseTypeExpr(pkgName, typeName string, typeExpr ast.Expr)
|
||||||
// type Foo pkg.Bar
|
// type Foo pkg.Bar
|
||||||
case *ast.SelectorExpr:
|
case *ast.SelectorExpr:
|
||||||
if xIdent, ok := expr.X.(*ast.Ident); ok {
|
if xIdent, ok := expr.X.(*ast.Ident); ok {
|
||||||
pkgName = xIdent.Name
|
return parser.parseTypeExpr(xIdent.Name, expr.Sel.Name, expr.Sel)
|
||||||
typeName = expr.Sel.Name
|
|
||||||
refTypeName := fullTypeName(pkgName, typeName)
|
|
||||||
if _, isParsed := parser.swagger.Definitions[refTypeName]; !isParsed {
|
|
||||||
typedef := parser.TypeDefinitions[pkgName][typeName]
|
|
||||||
parser.ParseDefinition(pkgName, typeName, typedef)
|
|
||||||
}
|
|
||||||
return parser.swagger.Definitions[refTypeName], nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// type Foo map[string]Bar
|
// type Foo map[string]Bar
|
||||||
case *ast.MapType:
|
case *ast.MapType:
|
||||||
itemSchema, err := parser.parseTypeExpr(pkgName, "", expr.Value)
|
var valueSchema spec.SchemaOrBool
|
||||||
if err != nil {
|
if _, ok := expr.Value.(*ast.InterfaceType); ok {
|
||||||
return spec.Schema{}, err
|
valueSchema.Allows = true
|
||||||
|
} else {
|
||||||
|
schema, err := parser.parseTypeExpr(pkgName, "", expr.Value)
|
||||||
|
if err != nil {
|
||||||
|
return &spec.Schema{}, err
|
||||||
|
}
|
||||||
|
valueSchema.Schema = schema
|
||||||
}
|
}
|
||||||
return spec.Schema{
|
return &spec.Schema{
|
||||||
SchemaProps: spec.SchemaProps{
|
SchemaProps: spec.SchemaProps{
|
||||||
Type: []string{"object"},
|
Type: []string{"object"},
|
||||||
AdditionalProperties: &spec.SchemaOrBool{
|
AdditionalProperties: &valueSchema,
|
||||||
Schema: &itemSchema,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
// ...
|
// ...
|
||||||
|
@ -703,21 +760,21 @@ func (parser *Parser) parseTypeExpr(pkgName, typeName string, typeExpr ast.Expr)
|
||||||
Printf("Type definition of type '%T' is not supported yet. Using 'object' instead.\n", typeExpr)
|
Printf("Type definition of type '%T' is not supported yet. Using 'object' instead.\n", typeExpr)
|
||||||
}
|
}
|
||||||
|
|
||||||
return spec.Schema{
|
return &spec.Schema{
|
||||||
SchemaProps: spec.SchemaProps{
|
SchemaProps: spec.SchemaProps{
|
||||||
Type: []string{"object"},
|
Type: []string{"object"},
|
||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (parser *Parser) parseStruct(pkgName string, fields *ast.FieldList) (spec.Schema, error) {
|
func (parser *Parser) parseStruct(pkgName string, fields *ast.FieldList) (*spec.Schema, error) {
|
||||||
|
|
||||||
extraRequired := make([]string, 0)
|
extraRequired := make([]string, 0)
|
||||||
properties := make(map[string]spec.Schema)
|
properties := make(map[string]spec.Schema)
|
||||||
for _, field := range fields.List {
|
for _, field := range fields.List {
|
||||||
fieldProps, requiredFromAnon, err := parser.parseStructField(pkgName, field)
|
fieldProps, requiredFromAnon, err := parser.parseStructField(pkgName, field)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return spec.Schema{}, err
|
return &spec.Schema{}, err
|
||||||
}
|
}
|
||||||
extraRequired = append(extraRequired, requiredFromAnon...)
|
extraRequired = append(extraRequired, requiredFromAnon...)
|
||||||
for k, v := range fieldProps {
|
for k, v := range fieldProps {
|
||||||
|
@ -730,14 +787,11 @@ func (parser *Parser) parseStruct(pkgName string, fields *ast.FieldList) (spec.S
|
||||||
|
|
||||||
// unset required from properties because we've collected them
|
// unset required from properties because we've collected them
|
||||||
for k, prop := range properties {
|
for k, prop := range properties {
|
||||||
tname := prop.SchemaProps.Type[0]
|
prop.SchemaProps.Required = make([]string, 0)
|
||||||
if tname != "object" {
|
|
||||||
prop.SchemaProps.Required = make([]string, 0)
|
|
||||||
}
|
|
||||||
properties[k] = prop
|
properties[k] = prop
|
||||||
}
|
}
|
||||||
|
|
||||||
return spec.Schema{
|
return &spec.Schema{
|
||||||
SchemaProps: spec.SchemaProps{
|
SchemaProps: spec.SchemaProps{
|
||||||
Type: []string{"object"},
|
Type: []string{"object"},
|
||||||
Properties: properties,
|
Properties: properties,
|
||||||
|
@ -747,6 +801,7 @@ func (parser *Parser) parseStruct(pkgName string, fields *ast.FieldList) (spec.S
|
||||||
|
|
||||||
type structField struct {
|
type structField struct {
|
||||||
name string
|
name string
|
||||||
|
desc string
|
||||||
schemaType string
|
schemaType string
|
||||||
arrayType string
|
arrayType string
|
||||||
formatType string
|
formatType string
|
||||||
|
@ -763,6 +818,34 @@ type structField struct {
|
||||||
extensions map[string]interface{}
|
extensions map[string]interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sf *structField) toStandardSchema() *spec.Schema {
|
||||||
|
required := make([]string, 0)
|
||||||
|
if sf.isRequired {
|
||||||
|
required = append(required, sf.name)
|
||||||
|
}
|
||||||
|
return &spec.Schema{
|
||||||
|
SchemaProps: spec.SchemaProps{
|
||||||
|
Type: []string{sf.schemaType},
|
||||||
|
Description: sf.desc,
|
||||||
|
Format: sf.formatType,
|
||||||
|
Required: required,
|
||||||
|
Maximum: sf.maximum,
|
||||||
|
Minimum: sf.minimum,
|
||||||
|
MaxLength: sf.maxLength,
|
||||||
|
MinLength: sf.minLength,
|
||||||
|
Enum: sf.enums,
|
||||||
|
Default: sf.defaultValue,
|
||||||
|
},
|
||||||
|
SwaggerSchemaProps: spec.SwaggerSchemaProps{
|
||||||
|
Example: sf.exampleValue,
|
||||||
|
ReadOnly: sf.readOnly,
|
||||||
|
},
|
||||||
|
VendorExtensible: spec.VendorExtensible{
|
||||||
|
Extensions: sf.extensions,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[string]spec.Schema, []string, error) {
|
func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[string]spec.Schema, []string, error) {
|
||||||
properties := map[string]spec.Schema{}
|
properties := map[string]spec.Schema{}
|
||||||
|
|
||||||
|
@ -780,6 +863,17 @@ func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[st
|
||||||
}
|
}
|
||||||
|
|
||||||
typeSpec := parser.TypeDefinitions[pkgName][typeName]
|
typeSpec := parser.TypeDefinitions[pkgName][typeName]
|
||||||
|
if typeSpec == nil {
|
||||||
|
// Check if the pkg name is an alias and try to define type spec using real package name
|
||||||
|
if aliases, ok := parser.ImportAliases[pkgName]; ok {
|
||||||
|
for alias := range aliases {
|
||||||
|
typeSpec = parser.TypeDefinitions[alias][typeName]
|
||||||
|
if typeSpec != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if typeSpec != nil {
|
if typeSpec != nil {
|
||||||
schema, err := parser.parseTypeExpr(pkgName, typeName, typeSpec.Type)
|
schema, err := parser.parseTypeExpr(pkgName, typeName, typeSpec.Type)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -796,7 +890,7 @@ func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[st
|
||||||
properties[k] = v
|
properties[k] = v
|
||||||
}
|
}
|
||||||
case "array":
|
case "array":
|
||||||
properties[typeName] = schema
|
properties[typeName] = *schema
|
||||||
default:
|
default:
|
||||||
Printf("Can't extract properties from a schema of type '%s'", schemaType)
|
Printf("Can't extract properties from a schema of type '%s'", schemaType)
|
||||||
}
|
}
|
||||||
|
@ -806,34 +900,57 @@ func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[st
|
||||||
return properties, nil, nil
|
return properties, nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
structField, err := parser.parseField(field)
|
structField, err := parser.parseField(pkgName, field)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return properties, nil, nil
|
return properties, nil, err
|
||||||
}
|
}
|
||||||
if structField.name == "" {
|
if structField.name == "" {
|
||||||
return properties, nil, nil
|
return properties, nil, nil
|
||||||
}
|
}
|
||||||
var desc string
|
|
||||||
if field.Doc != nil {
|
|
||||||
desc = strings.TrimSpace(field.Doc.Text())
|
|
||||||
}
|
|
||||||
if desc == "" && field.Comment != nil {
|
|
||||||
desc = strings.TrimSpace(field.Comment.Text())
|
|
||||||
}
|
|
||||||
// TODO: find package of schemaType and/or arrayType
|
// TODO: find package of schemaType and/or arrayType
|
||||||
if structField.crossPkg != "" {
|
if structField.crossPkg != "" {
|
||||||
pkgName = structField.crossPkg
|
pkgName = structField.crossPkg
|
||||||
}
|
}
|
||||||
if _, ok := parser.TypeDefinitions[pkgName][structField.schemaType]; ok { // user type field
|
|
||||||
|
fillObject := func(src, dest interface{}) error {
|
||||||
|
bin, err := json.Marshal(src)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return json.Unmarshal(bin, dest)
|
||||||
|
}
|
||||||
|
|
||||||
|
//for spec.Schema have implemented json.Marshaler, here in another way to convert
|
||||||
|
fillSchema := func(src, dest *spec.Schema) error {
|
||||||
|
err = fillObject(&src.SchemaProps, &dest.SchemaProps)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = fillObject(&src.SwaggerSchemaProps, &dest.SwaggerSchemaProps)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return fillObject(&src.VendorExtensible, &dest.VendorExtensible)
|
||||||
|
}
|
||||||
|
|
||||||
|
if typeSpec, ok := parser.TypeDefinitions[pkgName][structField.schemaType]; ok { // user type field
|
||||||
// write definition if not yet present
|
// write definition if not yet present
|
||||||
parser.ParseDefinition(pkgName, structField.schemaType,
|
err = parser.ParseDefinition(pkgName, structField.schemaType, typeSpec)
|
||||||
parser.TypeDefinitions[pkgName][structField.schemaType])
|
if err != nil {
|
||||||
|
return properties, nil, err
|
||||||
|
}
|
||||||
|
required := make([]string, 0)
|
||||||
|
if structField.isRequired {
|
||||||
|
required = append(required, structField.name)
|
||||||
|
}
|
||||||
properties[structField.name] = spec.Schema{
|
properties[structField.name] = spec.Schema{
|
||||||
SchemaProps: spec.SchemaProps{
|
SchemaProps: spec.SchemaProps{
|
||||||
Type: []string{"object"}, // to avoid swagger validation error
|
Type: []string{"object"}, // to avoid swagger validation error
|
||||||
Description: desc,
|
Description: structField.desc,
|
||||||
|
Required: required,
|
||||||
Ref: spec.Ref{
|
Ref: spec.Ref{
|
||||||
Ref: jsonreference.MustCreateRef("#/definitions/" + pkgName + "." + structField.schemaType),
|
Ref: jsonreference.MustCreateRef("#/definitions/" + TypeDocName(pkgName, typeSpec)),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
SwaggerSchemaProps: spec.SwaggerSchemaProps{
|
SwaggerSchemaProps: spec.SwaggerSchemaProps{
|
||||||
|
@ -842,18 +959,23 @@ func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[st
|
||||||
}
|
}
|
||||||
} else if structField.schemaType == "array" { // array field type
|
} else if structField.schemaType == "array" { // array field type
|
||||||
// if defined -- ref it
|
// if defined -- ref it
|
||||||
if _, ok := parser.TypeDefinitions[pkgName][structField.arrayType]; ok { // user type in array
|
if typeSpec, ok := parser.TypeDefinitions[pkgName][structField.arrayType]; ok { // user type in array
|
||||||
parser.ParseDefinition(pkgName, structField.arrayType,
|
parser.ParseDefinition(pkgName, structField.arrayType,
|
||||||
parser.TypeDefinitions[pkgName][structField.arrayType])
|
parser.TypeDefinitions[pkgName][structField.arrayType])
|
||||||
|
required := make([]string, 0)
|
||||||
|
if structField.isRequired {
|
||||||
|
required = append(required, structField.name)
|
||||||
|
}
|
||||||
properties[structField.name] = spec.Schema{
|
properties[structField.name] = spec.Schema{
|
||||||
SchemaProps: spec.SchemaProps{
|
SchemaProps: spec.SchemaProps{
|
||||||
Type: []string{structField.schemaType},
|
Type: []string{structField.schemaType},
|
||||||
Description: desc,
|
Description: structField.desc,
|
||||||
|
Required: required,
|
||||||
Items: &spec.SchemaOrArray{
|
Items: &spec.SchemaOrArray{
|
||||||
Schema: &spec.Schema{
|
Schema: &spec.Schema{
|
||||||
SchemaProps: spec.SchemaProps{
|
SchemaProps: spec.SchemaProps{
|
||||||
Ref: spec.Ref{
|
Ref: spec.Ref{
|
||||||
Ref: jsonreference.MustCreateRef("#/definitions/" + pkgName + "." + structField.arrayType),
|
Ref: jsonreference.MustCreateRef("#/definitions/" + TypeDocName(pkgName, typeSpec)),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -881,7 +1003,7 @@ func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[st
|
||||||
properties[structField.name] = spec.Schema{
|
properties[structField.name] = spec.Schema{
|
||||||
SchemaProps: spec.SchemaProps{
|
SchemaProps: spec.SchemaProps{
|
||||||
Type: []string{structField.schemaType},
|
Type: []string{structField.schemaType},
|
||||||
Description: desc,
|
Description: structField.desc,
|
||||||
Items: &spec.SchemaOrArray{
|
Items: &spec.SchemaOrArray{
|
||||||
Schema: &spec.Schema{
|
Schema: &spec.Schema{
|
||||||
SchemaProps: spec.SchemaProps{
|
SchemaProps: spec.SchemaProps{
|
||||||
|
@ -895,6 +1017,36 @@ func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[st
|
||||||
ReadOnly: structField.readOnly,
|
ReadOnly: structField.readOnly,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
schema, _ := parser.parseTypeExpr(pkgName, "", astTypeArray.Elt)
|
||||||
|
properties[structField.name] = spec.Schema{
|
||||||
|
SchemaProps: spec.SchemaProps{
|
||||||
|
Type: []string{structField.schemaType},
|
||||||
|
Description: structField.desc,
|
||||||
|
Items: &spec.SchemaOrArray{
|
||||||
|
Schema: schema,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
SwaggerSchemaProps: spec.SwaggerSchemaProps{
|
||||||
|
ReadOnly: structField.readOnly,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if structField.arrayType == "array" {
|
||||||
|
if astTypeArray, ok := field.Type.(*ast.ArrayType); ok {
|
||||||
|
schema, _ := parser.parseTypeExpr(pkgName, "", astTypeArray.Elt)
|
||||||
|
properties[structField.name] = spec.Schema{
|
||||||
|
SchemaProps: spec.SchemaProps{
|
||||||
|
Type: []string{structField.schemaType},
|
||||||
|
Description: structField.desc,
|
||||||
|
Items: &spec.SchemaOrArray{
|
||||||
|
Schema: schema,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
SwaggerSchemaProps: spec.SwaggerSchemaProps{
|
||||||
|
ReadOnly: structField.readOnly,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -907,7 +1059,7 @@ func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[st
|
||||||
properties[structField.name] = spec.Schema{
|
properties[structField.name] = spec.Schema{
|
||||||
SchemaProps: spec.SchemaProps{
|
SchemaProps: spec.SchemaProps{
|
||||||
Type: []string{structField.schemaType},
|
Type: []string{structField.schemaType},
|
||||||
Description: desc,
|
Description: structField.desc,
|
||||||
Format: structField.formatType,
|
Format: structField.formatType,
|
||||||
Required: required,
|
Required: required,
|
||||||
Items: &spec.SchemaOrArray{
|
Items: &spec.SchemaOrArray{
|
||||||
|
@ -930,47 +1082,36 @@ func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[st
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if astTypeMap, ok := field.Type.(*ast.MapType); ok { // if map
|
||||||
|
stdSchema := structField.toStandardSchema()
|
||||||
|
mapValueSchema, err := parser.parseTypeExpr(pkgName, "", astTypeMap)
|
||||||
|
if err != nil {
|
||||||
|
return properties, nil, err
|
||||||
|
}
|
||||||
|
stdSchema.Type = mapValueSchema.Type
|
||||||
|
stdSchema.AdditionalProperties = mapValueSchema.AdditionalProperties
|
||||||
|
properties[structField.name] = *stdSchema
|
||||||
} else {
|
} else {
|
||||||
required := make([]string, 0)
|
stdSchema := structField.toStandardSchema()
|
||||||
if structField.isRequired {
|
properties[structField.name] = *stdSchema
|
||||||
required = append(required, structField.name)
|
|
||||||
}
|
|
||||||
properties[structField.name] = spec.Schema{
|
|
||||||
SchemaProps: spec.SchemaProps{
|
|
||||||
Type: []string{structField.schemaType},
|
|
||||||
Description: desc,
|
|
||||||
Format: structField.formatType,
|
|
||||||
Required: required,
|
|
||||||
Maximum: structField.maximum,
|
|
||||||
Minimum: structField.minimum,
|
|
||||||
MaxLength: structField.maxLength,
|
|
||||||
MinLength: structField.minLength,
|
|
||||||
Enum: structField.enums,
|
|
||||||
Default: structField.defaultValue,
|
|
||||||
},
|
|
||||||
SwaggerSchemaProps: spec.SwaggerSchemaProps{
|
|
||||||
Example: structField.exampleValue,
|
|
||||||
ReadOnly: structField.readOnly,
|
|
||||||
},
|
|
||||||
VendorExtensible: spec.VendorExtensible{
|
|
||||||
Extensions: structField.extensions,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
if nestStruct, ok := field.Type.(*ast.StarExpr); ok {
|
if nestStar, ok := field.Type.(*ast.StarExpr); ok {
|
||||||
schema, err := parser.parseTypeExpr(pkgName, structField.schemaType, nestStruct.X)
|
if !IsGolangPrimitiveType(structField.schemaType) {
|
||||||
if err != nil {
|
schema, err := parser.parseTypeExpr(pkgName, structField.schemaType, nestStar.X)
|
||||||
return nil, nil, err
|
if err != nil {
|
||||||
|
return properties, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(schema.SchemaProps.Type) > 0 {
|
||||||
|
err = fillSchema(schema, stdSchema)
|
||||||
|
if err != nil {
|
||||||
|
return properties, nil, err
|
||||||
|
}
|
||||||
|
properties[structField.name] = *stdSchema
|
||||||
|
return properties, nil, nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else if nestStruct, ok := field.Type.(*ast.StructType); ok {
|
||||||
if len(schema.SchemaProps.Type) > 0 {
|
|
||||||
properties[structField.name] = schema
|
|
||||||
return properties, nil, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nestStruct, ok := field.Type.(*ast.StructType)
|
|
||||||
if ok {
|
|
||||||
props := map[string]spec.Schema{}
|
props := map[string]spec.Schema{}
|
||||||
nestRequired := make([]string, 0)
|
nestRequired := make([]string, 0)
|
||||||
for _, v := range nestStruct.Fields.List {
|
for _, v := range nestStruct.Fields.List {
|
||||||
|
@ -986,26 +1127,9 @@ func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[st
|
||||||
props[k] = v
|
props[k] = v
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
stdSchema.Properties = props
|
||||||
properties[structField.name] = spec.Schema{
|
stdSchema.Required = nestRequired
|
||||||
SchemaProps: spec.SchemaProps{
|
properties[structField.name] = *stdSchema
|
||||||
Type: []string{structField.schemaType},
|
|
||||||
Description: desc,
|
|
||||||
Format: structField.formatType,
|
|
||||||
Properties: props,
|
|
||||||
Required: nestRequired,
|
|
||||||
Maximum: structField.maximum,
|
|
||||||
Minimum: structField.minimum,
|
|
||||||
MaxLength: structField.maxLength,
|
|
||||||
MinLength: structField.minLength,
|
|
||||||
Enum: structField.enums,
|
|
||||||
Default: structField.defaultValue,
|
|
||||||
},
|
|
||||||
SwaggerSchemaProps: spec.SwaggerSchemaProps{
|
|
||||||
Example: structField.exampleValue,
|
|
||||||
ReadOnly: structField.readOnly,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return properties, nil, nil
|
return properties, nil, nil
|
||||||
|
@ -1035,8 +1159,8 @@ func getFieldType(field interface{}) (string, error) {
|
||||||
return "", fmt.Errorf("unknown field type %#v", field)
|
return "", fmt.Errorf("unknown field type %#v", field)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (parser *Parser) parseField(field *ast.Field) (*structField, error) {
|
func (parser *Parser) parseField(pkgName string, field *ast.Field) (*structField, error) {
|
||||||
prop, err := getPropertyName(field.Type, parser)
|
prop, err := getPropertyName(pkgName, field.Type, parser)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -1051,6 +1175,16 @@ func (parser *Parser) parseField(field *ast.Field) (*structField, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Skip func fields.
|
||||||
|
if prop.SchemaType == "func" {
|
||||||
|
return &structField{name: ""}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Skip non-exported fields.
|
||||||
|
if !ast.IsExported(field.Names[0].Name) {
|
||||||
|
return &structField{name: ""}, nil
|
||||||
|
}
|
||||||
|
|
||||||
structField := &structField{
|
structField := &structField{
|
||||||
name: field.Names[0].Name,
|
name: field.Names[0].Name,
|
||||||
schemaType: prop.SchemaType,
|
schemaType: prop.SchemaType,
|
||||||
|
@ -1069,14 +1203,33 @@ func (parser *Parser) parseField(field *ast.Field) (*structField, error) {
|
||||||
structField.name = toLowerCamelCase(structField.name)
|
structField.name = toLowerCamelCase(structField.name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if field.Doc != nil {
|
||||||
|
structField.desc = strings.TrimSpace(field.Doc.Text())
|
||||||
|
}
|
||||||
|
if structField.desc == "" && field.Comment != nil {
|
||||||
|
structField.desc = strings.TrimSpace(field.Comment.Text())
|
||||||
|
}
|
||||||
|
|
||||||
if field.Tag == nil {
|
if field.Tag == nil {
|
||||||
return structField, nil
|
return structField, nil
|
||||||
}
|
}
|
||||||
// `json:"tag"` -> json:"tag"
|
// `json:"tag"` -> json:"tag"
|
||||||
structTag := reflect.StructTag(strings.Replace(field.Tag.Value, "`", "", -1))
|
structTag := reflect.StructTag(strings.Replace(field.Tag.Value, "`", "", -1))
|
||||||
|
|
||||||
|
if ignoreTag := structTag.Get("swaggerignore"); ignoreTag == "true" {
|
||||||
|
structField.name = ""
|
||||||
|
return structField, nil
|
||||||
|
}
|
||||||
|
|
||||||
jsonTag := structTag.Get("json")
|
jsonTag := structTag.Get("json")
|
||||||
|
hasStringTag := false
|
||||||
// json:"tag,hoge"
|
// json:"tag,hoge"
|
||||||
if strings.Contains(jsonTag, ",") {
|
if strings.Contains(jsonTag, ",") {
|
||||||
|
// json:"name,string" or json:",string"
|
||||||
|
if strings.Contains(jsonTag, ",string") {
|
||||||
|
hasStringTag = true
|
||||||
|
}
|
||||||
|
|
||||||
// json:",hoge"
|
// json:",hoge"
|
||||||
if strings.HasPrefix(jsonTag, ",") {
|
if strings.HasPrefix(jsonTag, ",") {
|
||||||
jsonTag = ""
|
jsonTag = ""
|
||||||
|
@ -1086,6 +1239,7 @@ func (parser *Parser) parseField(field *ast.Field) (*structField, error) {
|
||||||
}
|
}
|
||||||
if jsonTag == "-" {
|
if jsonTag == "-" {
|
||||||
structField.name = ""
|
structField.name = ""
|
||||||
|
return structField, nil
|
||||||
} else if jsonTag != "" {
|
} else if jsonTag != "" {
|
||||||
structField.name = jsonTag
|
structField.name = jsonTag
|
||||||
}
|
}
|
||||||
|
@ -1098,6 +1252,9 @@ func (parser *Parser) parseField(field *ast.Field) (*structField, error) {
|
||||||
if len(parts) >= 2 {
|
if len(parts) >= 2 {
|
||||||
if newSchemaType == "array" {
|
if newSchemaType == "array" {
|
||||||
newArrayType = parts[1]
|
newArrayType = parts[1]
|
||||||
|
if err := CheckSchemaType(newArrayType); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
} else if newSchemaType == "primitive" {
|
} else if newSchemaType == "primitive" {
|
||||||
newSchemaType = parts[1]
|
newSchemaType = parts[1]
|
||||||
newArrayType = parts[1]
|
newArrayType = parts[1]
|
||||||
|
@ -1107,19 +1264,22 @@ func (parser *Parser) parseField(field *ast.Field) (*structField, error) {
|
||||||
if err := CheckSchemaType(newSchemaType); err != nil {
|
if err := CheckSchemaType(newSchemaType); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := CheckSchemaType(newArrayType); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
structField.schemaType = newSchemaType
|
structField.schemaType = newSchemaType
|
||||||
structField.arrayType = newArrayType
|
structField.arrayType = newArrayType
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if exampleTag := structTag.Get("example"); exampleTag != "" {
|
if exampleTag := structTag.Get("example"); exampleTag != "" {
|
||||||
example, err := defineTypeOfExample(structField.schemaType, structField.arrayType, exampleTag)
|
if hasStringTag {
|
||||||
if err != nil {
|
// then the example must be in string format
|
||||||
return nil, err
|
structField.exampleValue = exampleTag
|
||||||
|
} else {
|
||||||
|
example, err := defineTypeOfExample(structField.schemaType, structField.arrayType, exampleTag)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
structField.exampleValue = example
|
||||||
}
|
}
|
||||||
structField.exampleValue = example
|
|
||||||
}
|
}
|
||||||
if formatTag := structTag.Get("format"); formatTag != "" {
|
if formatTag := structTag.Get("format"); formatTag != "" {
|
||||||
structField.formatType = formatTag
|
structField.formatType = formatTag
|
||||||
|
@ -1203,6 +1363,30 @@ func (parser *Parser) parseField(field *ast.Field) (*structField, error) {
|
||||||
structField.readOnly = readOnly == "true"
|
structField.readOnly = readOnly == "true"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// perform this after setting everything else (min, max, etc...)
|
||||||
|
if hasStringTag {
|
||||||
|
|
||||||
|
// @encoding/json: "It applies only to fields of string, floating point, integer, or boolean types."
|
||||||
|
defaultValues := map[string]string{
|
||||||
|
// Zero Values as string
|
||||||
|
"string": "",
|
||||||
|
"integer": "0",
|
||||||
|
"boolean": "false",
|
||||||
|
"number": "0",
|
||||||
|
}
|
||||||
|
|
||||||
|
if defaultValue, ok := defaultValues[structField.schemaType]; ok {
|
||||||
|
structField.schemaType = "string"
|
||||||
|
|
||||||
|
if structField.exampleValue == nil {
|
||||||
|
// if exampleValue is not defined by the user,
|
||||||
|
// we will force an example with a correct value
|
||||||
|
// (eg: int->"0", bool:"false")
|
||||||
|
structField.exampleValue = defaultValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return structField, nil
|
return structField, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1316,10 +1500,15 @@ func (parser *Parser) getAllGoFileInfo(searchDir string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (parser *Parser) getAllGoFileInfoFromDeps(pkg *depth.Pkg) error {
|
func (parser *Parser) getAllGoFileInfoFromDeps(pkg *depth.Pkg) error {
|
||||||
if pkg.Internal || !pkg.Resolved { // ignored internal and not resolved dependencies
|
ignoreInternal := pkg.Internal && !parser.ParseInternal
|
||||||
|
if ignoreInternal || !pkg.Resolved { // ignored internal and not resolved dependencies
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Skip cgo
|
||||||
|
if pkg.Raw == nil && pkg.Name == "C" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
srcDir := pkg.Raw.Dir
|
srcDir := pkg.Raw.Dir
|
||||||
files, err := ioutil.ReadDir(srcDir) // only parsing files in the dir(don't contains sub dir files)
|
files, err := ioutil.ReadDir(srcDir) // only parsing files in the dir(don't contains sub dir files)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -1368,22 +1557,20 @@ func (parser *Parser) parseFile(path string) error {
|
||||||
|
|
||||||
// Skip returns filepath.SkipDir error if match vendor and hidden folder
|
// Skip returns filepath.SkipDir error if match vendor and hidden folder
|
||||||
func (parser *Parser) Skip(path string, f os.FileInfo) error {
|
func (parser *Parser) Skip(path string, f os.FileInfo) error {
|
||||||
|
if f.IsDir() {
|
||||||
if !parser.ParseVendor { // ignore vendor
|
if !parser.ParseVendor && f.Name() == "vendor" || //ignore "vendor"
|
||||||
if f.IsDir() && f.Name() == "vendor" {
|
f.Name() == "docs" || //exclude docs
|
||||||
|
len(f.Name()) > 1 && f.Name()[0] == '.' { // exclude all hidden folder
|
||||||
return filepath.SkipDir
|
return filepath.SkipDir
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if parser.excludes != nil {
|
||||||
|
if _, ok := parser.excludes[path]; ok {
|
||||||
|
return filepath.SkipDir
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// issue
|
|
||||||
if f.IsDir() && f.Name() == "docs" {
|
|
||||||
return filepath.SkipDir
|
|
||||||
}
|
|
||||||
|
|
||||||
// exclude all hidden folder
|
|
||||||
if f.IsDir() && len(f.Name()) > 1 && f.Name()[0] == '.' {
|
|
||||||
return filepath.SkipDir
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
113
vendor/github.com/swaggo/swag/property.go
generated
vendored
113
vendor/github.com/swaggo/swag/property.go
generated
vendored
|
@ -60,7 +60,21 @@ func parseFieldSelectorExpr(astTypeSelectorExpr *ast.SelectorExpr, parser *Parse
|
||||||
parser.ParseDefinition(pkgName.Name, astTypeSelectorExpr.Sel.Name, typeDefinitions)
|
parser.ParseDefinition(pkgName.Name, astTypeSelectorExpr.Sel.Name, typeDefinitions)
|
||||||
return propertyNewFunc(astTypeSelectorExpr.Sel.Name, pkgName.Name)
|
return propertyNewFunc(astTypeSelectorExpr.Sel.Name, pkgName.Name)
|
||||||
}
|
}
|
||||||
if actualPrimitiveType, isCustomType := parser.CustomPrimitiveTypes[astTypeSelectorExpr.Sel.Name]; isCustomType {
|
if aliasedNames, ok := parser.ImportAliases[pkgName.Name]; ok {
|
||||||
|
for aliasedName := range aliasedNames {
|
||||||
|
if typeDefinitions, ok := parser.TypeDefinitions[aliasedName][astTypeSelectorExpr.Sel.Name]; ok {
|
||||||
|
if expr, ok := typeDefinitions.Type.(*ast.SelectorExpr); ok {
|
||||||
|
if primitiveType, err := convertFromSpecificToPrimitive(expr.Sel.Name); err == nil {
|
||||||
|
return propertyNewFunc(primitiveType, "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parser.ParseDefinition(aliasedName, astTypeSelectorExpr.Sel.Name, typeDefinitions)
|
||||||
|
return propertyNewFunc(astTypeSelectorExpr.Sel.Name, aliasedName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
name := fmt.Sprintf("%s.%v", pkgName, astTypeSelectorExpr.Sel.Name)
|
||||||
|
if actualPrimitiveType, isCustomType := parser.CustomPrimitiveTypes[name]; isCustomType {
|
||||||
return propertyName{SchemaType: actualPrimitiveType, ArrayType: actualPrimitiveType}
|
return propertyName{SchemaType: actualPrimitiveType, ArrayType: actualPrimitiveType}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -69,64 +83,57 @@ func parseFieldSelectorExpr(astTypeSelectorExpr *ast.SelectorExpr, parser *Parse
|
||||||
|
|
||||||
// getPropertyName returns the string value for the given field if it exists
|
// getPropertyName returns the string value for the given field if it exists
|
||||||
// allowedValues: array, boolean, integer, null, number, object, string
|
// allowedValues: array, boolean, integer, null, number, object, string
|
||||||
func getPropertyName(expr ast.Expr, parser *Parser) (propertyName, error) {
|
func getPropertyName(pkgName string, expr ast.Expr, parser *Parser) (propertyName, error) {
|
||||||
if astTypeSelectorExpr, ok := expr.(*ast.SelectorExpr); ok {
|
switch tp := expr.(type) {
|
||||||
return parseFieldSelectorExpr(astTypeSelectorExpr, parser, newProperty), nil
|
case *ast.SelectorExpr:
|
||||||
}
|
return parseFieldSelectorExpr(tp, parser, newProperty), nil
|
||||||
|
case *ast.StarExpr:
|
||||||
// check if it is a custom type
|
return getPropertyName(pkgName, tp.X, parser)
|
||||||
typeName := fmt.Sprintf("%v", expr)
|
case *ast.ArrayType:
|
||||||
if actualPrimitiveType, isCustomType := parser.CustomPrimitiveTypes[typeName]; isCustomType {
|
return getArrayPropertyName(pkgName, tp.Elt, parser), nil
|
||||||
return propertyName{SchemaType: actualPrimitiveType, ArrayType: actualPrimitiveType}, nil
|
case *ast.MapType, *ast.StructType, *ast.InterfaceType:
|
||||||
}
|
return propertyName{SchemaType: "object", ArrayType: "object"}, nil
|
||||||
|
case *ast.FuncType:
|
||||||
if astTypeIdent, ok := expr.(*ast.Ident); ok {
|
return propertyName{SchemaType: "func", ArrayType: ""}, nil
|
||||||
name := astTypeIdent.Name
|
case *ast.Ident:
|
||||||
schemeType := TransToValidSchemeType(name)
|
name := tp.Name
|
||||||
return propertyName{SchemaType: schemeType, ArrayType: schemeType}, nil
|
// check if it is a custom type
|
||||||
}
|
if actualPrimitiveType, isCustomType := parser.CustomPrimitiveTypes[fullTypeName(pkgName, name)]; isCustomType {
|
||||||
|
return propertyName{SchemaType: actualPrimitiveType, ArrayType: actualPrimitiveType}, nil
|
||||||
if ptr, ok := expr.(*ast.StarExpr); ok {
|
|
||||||
return getPropertyName(ptr.X, parser)
|
|
||||||
}
|
|
||||||
|
|
||||||
if astTypeArray, ok := expr.(*ast.ArrayType); ok { // if array
|
|
||||||
if _, ok := astTypeArray.Elt.(*ast.StructType); ok {
|
|
||||||
return propertyName{SchemaType: "array", ArrayType: "object"}, nil
|
|
||||||
}
|
}
|
||||||
return getArrayPropertyName(astTypeArray, parser), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, ok := expr.(*ast.MapType); ok { // if map
|
name = TransToValidSchemeType(name)
|
||||||
return propertyName{SchemaType: "object", ArrayType: "object"}, nil
|
return propertyName{SchemaType: name, ArrayType: name}, nil
|
||||||
|
default:
|
||||||
|
return propertyName{}, errors.New("not supported" + fmt.Sprint(expr))
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, ok := expr.(*ast.StructType); ok { // if struct
|
|
||||||
return propertyName{SchemaType: "object", ArrayType: "object"}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, ok := expr.(*ast.InterfaceType); ok { // if interface{}
|
|
||||||
return propertyName{SchemaType: "object", ArrayType: "object"}, nil
|
|
||||||
}
|
|
||||||
return propertyName{}, errors.New("not supported" + fmt.Sprint(expr))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func getArrayPropertyName(astTypeArray *ast.ArrayType, parser *Parser) propertyName {
|
func getArrayPropertyName(pkgName string, astTypeArrayElt ast.Expr, parser *Parser) propertyName {
|
||||||
if astTypeArrayExpr, ok := astTypeArray.Elt.(*ast.SelectorExpr); ok {
|
switch elt := astTypeArrayElt.(type) {
|
||||||
return parseFieldSelectorExpr(astTypeArrayExpr, parser, newArrayProperty)
|
case *ast.StructType, *ast.MapType, *ast.InterfaceType:
|
||||||
}
|
return propertyName{SchemaType: "array", ArrayType: "object"}
|
||||||
if astTypeArrayExpr, ok := astTypeArray.Elt.(*ast.StarExpr); ok {
|
case *ast.ArrayType:
|
||||||
if astTypeArraySel, ok := astTypeArrayExpr.X.(*ast.SelectorExpr); ok {
|
return propertyName{SchemaType: "array", ArrayType: "array"}
|
||||||
return parseFieldSelectorExpr(astTypeArraySel, parser, newArrayProperty)
|
case *ast.StarExpr:
|
||||||
|
return getArrayPropertyName(pkgName, elt.X, parser)
|
||||||
|
case *ast.SelectorExpr:
|
||||||
|
return parseFieldSelectorExpr(elt, parser, newArrayProperty)
|
||||||
|
case *ast.Ident:
|
||||||
|
name := elt.Name
|
||||||
|
if actualPrimitiveType, isCustomType := parser.CustomPrimitiveTypes[fullTypeName(pkgName, name)]; isCustomType {
|
||||||
|
name = actualPrimitiveType
|
||||||
|
} else {
|
||||||
|
name = TransToValidSchemeType(elt.Name)
|
||||||
}
|
}
|
||||||
if astTypeArrayIdent, ok := astTypeArrayExpr.X.(*ast.Ident); ok {
|
return propertyName{SchemaType: "array", ArrayType: name}
|
||||||
name := TransToValidSchemeType(astTypeArrayIdent.Name)
|
default:
|
||||||
return propertyName{SchemaType: "array", ArrayType: name}
|
name := fmt.Sprintf("%s", astTypeArrayElt)
|
||||||
|
if actualPrimitiveType, isCustomType := parser.CustomPrimitiveTypes[fullTypeName(pkgName, name)]; isCustomType {
|
||||||
|
name = actualPrimitiveType
|
||||||
|
} else {
|
||||||
|
name = TransToValidSchemeType(name)
|
||||||
}
|
}
|
||||||
|
return propertyName{SchemaType: "array", ArrayType: name}
|
||||||
}
|
}
|
||||||
itemTypeName := TransToValidSchemeType(fmt.Sprintf("%s", astTypeArray.Elt))
|
|
||||||
if actualPrimitiveType, isCustomType := parser.CustomPrimitiveTypes[itemTypeName]; isCustomType {
|
|
||||||
itemTypeName = actualPrimitiveType
|
|
||||||
}
|
|
||||||
return propertyName{SchemaType: "array", ArrayType: itemTypeName}
|
|
||||||
}
|
}
|
||||||
|
|
50
vendor/github.com/swaggo/swag/schema.go
generated
vendored
50
vendor/github.com/swaggo/swag/schema.go
generated
vendored
|
@ -1,6 +1,10 @@
|
||||||
package swag
|
package swag
|
||||||
|
|
||||||
import "fmt"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"go/ast"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
// CheckSchemaType checks if typeName is not a name of primitive type
|
// CheckSchemaType checks if typeName is not a name of primitive type
|
||||||
func CheckSchemaType(typeName string) error {
|
func CheckSchemaType(typeName string) error {
|
||||||
|
@ -10,10 +14,20 @@ func CheckSchemaType(typeName string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsSimplePrimitiveType determine whether the type name is a simple primitive type
|
||||||
|
func IsSimplePrimitiveType(typeName string) bool {
|
||||||
|
switch typeName {
|
||||||
|
case "string", "number", "integer", "boolean":
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// IsPrimitiveType determine whether the type name is a primitive type
|
// IsPrimitiveType determine whether the type name is a primitive type
|
||||||
func IsPrimitiveType(typeName string) bool {
|
func IsPrimitiveType(typeName string) bool {
|
||||||
switch typeName {
|
switch typeName {
|
||||||
case "string", "number", "integer", "boolean", "array", "object":
|
case "string", "number", "integer", "boolean", "array", "object", "func":
|
||||||
return true
|
return true
|
||||||
default:
|
default:
|
||||||
return false
|
return false
|
||||||
|
@ -69,3 +83,35 @@ func IsGolangPrimitiveType(typeName string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TransToValidCollectionFormat determine valid collection format
|
||||||
|
func TransToValidCollectionFormat(format string) string {
|
||||||
|
switch format {
|
||||||
|
case "csv", "multi", "pipes", "tsv", "ssv":
|
||||||
|
return format
|
||||||
|
default:
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TypeDocName get alias from comment '// @name ', otherwise the original type name to display in doc
|
||||||
|
func TypeDocName(pkgName string, spec *ast.TypeSpec) string {
|
||||||
|
if spec != nil {
|
||||||
|
if spec.Comment != nil {
|
||||||
|
for _, comment := range spec.Comment.List {
|
||||||
|
text := strings.TrimSpace(comment.Text)
|
||||||
|
text = strings.TrimLeft(text, "//")
|
||||||
|
text = strings.TrimSpace(text)
|
||||||
|
texts := strings.Split(text, " ")
|
||||||
|
if len(texts) > 1 && strings.ToLower(texts[0]) == "@name" {
|
||||||
|
return texts[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if spec.Name != nil {
|
||||||
|
return fullTypeName(strings.Split(pkgName, ".")[0], spec.Name.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pkgName
|
||||||
|
}
|
||||||
|
|
2
vendor/github.com/swaggo/swag/version.go
generated
vendored
2
vendor/github.com/swaggo/swag/version.go
generated
vendored
|
@ -1,4 +1,4 @@
|
||||||
package swag
|
package swag
|
||||||
|
|
||||||
// Version of swag
|
// Version of swag
|
||||||
const Version = "v1.6.3"
|
const Version = "v1.6.7"
|
||||||
|
|
35
vendor/github.com/urfave/cli/.travis.yml
generated
vendored
35
vendor/github.com/urfave/cli/.travis.yml
generated
vendored
|
@ -1,35 +0,0 @@
|
||||||
language: go
|
|
||||||
sudo: false
|
|
||||||
dist: bionic
|
|
||||||
osx_image: xcode10
|
|
||||||
go:
|
|
||||||
- 1.11.x
|
|
||||||
- 1.12.x
|
|
||||||
- 1.13.x
|
|
||||||
|
|
||||||
os:
|
|
||||||
- linux
|
|
||||||
- osx
|
|
||||||
|
|
||||||
env:
|
|
||||||
GO111MODULE=on
|
|
||||||
GOPROXY=https://proxy.golang.org
|
|
||||||
|
|
||||||
cache:
|
|
||||||
directories:
|
|
||||||
- node_modules
|
|
||||||
|
|
||||||
before_script:
|
|
||||||
- go get github.com/urfave/gfmrun/cmd/gfmrun
|
|
||||||
- go get golang.org/x/tools/cmd/goimports
|
|
||||||
- npm install markdown-toc
|
|
||||||
- go mod tidy
|
|
||||||
|
|
||||||
script:
|
|
||||||
- go run build.go vet
|
|
||||||
- go run build.go test
|
|
||||||
- go run build.go gfmrun docs/v1/manual.md
|
|
||||||
- go run build.go toc docs/v1/manual.md
|
|
||||||
|
|
||||||
after_success:
|
|
||||||
- bash <(curl -s https://codecov.io/bash)
|
|
44
vendor/github.com/urfave/cli/category.go
generated
vendored
44
vendor/github.com/urfave/cli/category.go
generated
vendored
|
@ -1,44 +0,0 @@
|
||||||
package cli
|
|
||||||
|
|
||||||
// CommandCategories is a slice of *CommandCategory.
|
|
||||||
type CommandCategories []*CommandCategory
|
|
||||||
|
|
||||||
// CommandCategory is a category containing commands.
|
|
||||||
type CommandCategory struct {
|
|
||||||
Name string
|
|
||||||
Commands Commands
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c CommandCategories) Less(i, j int) bool {
|
|
||||||
return lexicographicLess(c[i].Name, c[j].Name)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c CommandCategories) Len() int {
|
|
||||||
return len(c)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c CommandCategories) Swap(i, j int) {
|
|
||||||
c[i], c[j] = c[j], c[i]
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddCommand adds a command to a category.
|
|
||||||
func (c CommandCategories) AddCommand(category string, command Command) CommandCategories {
|
|
||||||
for _, commandCategory := range c {
|
|
||||||
if commandCategory.Name == category {
|
|
||||||
commandCategory.Commands = append(commandCategory.Commands, command)
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return append(c, &CommandCategory{Name: category, Commands: []Command{command}})
|
|
||||||
}
|
|
||||||
|
|
||||||
// VisibleCommands returns a slice of the Commands with Hidden=false
|
|
||||||
func (c *CommandCategory) VisibleCommands() []Command {
|
|
||||||
ret := []Command{}
|
|
||||||
for _, command := range c.Commands {
|
|
||||||
if !command.Hidden {
|
|
||||||
ret = append(ret, command)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret
|
|
||||||
}
|
|
339
vendor/github.com/urfave/cli/context.go
generated
vendored
339
vendor/github.com/urfave/cli/context.go
generated
vendored
|
@ -1,339 +0,0 @@
|
||||||
package cli
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"reflect"
|
|
||||||
"strings"
|
|
||||||
"syscall"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Context is a type that is passed through to
|
|
||||||
// each Handler action in a cli application. Context
|
|
||||||
// can be used to retrieve context-specific Args and
|
|
||||||
// parsed command-line options.
|
|
||||||
type Context struct {
|
|
||||||
App *App
|
|
||||||
Command Command
|
|
||||||
shellComplete bool
|
|
||||||
flagSet *flag.FlagSet
|
|
||||||
setFlags map[string]bool
|
|
||||||
parentContext *Context
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewContext creates a new context. For use in when invoking an App or Command action.
|
|
||||||
func NewContext(app *App, set *flag.FlagSet, parentCtx *Context) *Context {
|
|
||||||
c := &Context{App: app, flagSet: set, parentContext: parentCtx}
|
|
||||||
|
|
||||||
if parentCtx != nil {
|
|
||||||
c.shellComplete = parentCtx.shellComplete
|
|
||||||
}
|
|
||||||
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
// NumFlags returns the number of flags set
|
|
||||||
func (c *Context) NumFlags() int {
|
|
||||||
return c.flagSet.NFlag()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set sets a context flag to a value.
|
|
||||||
func (c *Context) Set(name, value string) error {
|
|
||||||
c.setFlags = nil
|
|
||||||
return c.flagSet.Set(name, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GlobalSet sets a context flag to a value on the global flagset
|
|
||||||
func (c *Context) GlobalSet(name, value string) error {
|
|
||||||
globalContext(c).setFlags = nil
|
|
||||||
return globalContext(c).flagSet.Set(name, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsSet determines if the flag was actually set
|
|
||||||
func (c *Context) IsSet(name string) bool {
|
|
||||||
if c.setFlags == nil {
|
|
||||||
c.setFlags = make(map[string]bool)
|
|
||||||
|
|
||||||
c.flagSet.Visit(func(f *flag.Flag) {
|
|
||||||
c.setFlags[f.Name] = true
|
|
||||||
})
|
|
||||||
|
|
||||||
c.flagSet.VisitAll(func(f *flag.Flag) {
|
|
||||||
if _, ok := c.setFlags[f.Name]; ok {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
c.setFlags[f.Name] = false
|
|
||||||
})
|
|
||||||
|
|
||||||
// XXX hack to support IsSet for flags with EnvVar
|
|
||||||
//
|
|
||||||
// There isn't an easy way to do this with the current implementation since
|
|
||||||
// whether a flag was set via an environment variable is very difficult to
|
|
||||||
// determine here. Instead, we intend to introduce a backwards incompatible
|
|
||||||
// change in version 2 to add `IsSet` to the Flag interface to push the
|
|
||||||
// responsibility closer to where the information required to determine
|
|
||||||
// whether a flag is set by non-standard means such as environment
|
|
||||||
// variables is available.
|
|
||||||
//
|
|
||||||
// See https://github.com/urfave/cli/issues/294 for additional discussion
|
|
||||||
flags := c.Command.Flags
|
|
||||||
if c.Command.Name == "" { // cannot == Command{} since it contains slice types
|
|
||||||
if c.App != nil {
|
|
||||||
flags = c.App.Flags
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, f := range flags {
|
|
||||||
eachName(f.GetName(), func(name string) {
|
|
||||||
if isSet, ok := c.setFlags[name]; isSet || !ok {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
val := reflect.ValueOf(f)
|
|
||||||
if val.Kind() == reflect.Ptr {
|
|
||||||
val = val.Elem()
|
|
||||||
}
|
|
||||||
|
|
||||||
filePathValue := val.FieldByName("FilePath")
|
|
||||||
if filePathValue.IsValid() {
|
|
||||||
eachName(filePathValue.String(), func(filePath string) {
|
|
||||||
if _, err := os.Stat(filePath); err == nil {
|
|
||||||
c.setFlags[name] = true
|
|
||||||
return
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
envVarValue := val.FieldByName("EnvVar")
|
|
||||||
if envVarValue.IsValid() {
|
|
||||||
eachName(envVarValue.String(), func(envVar string) {
|
|
||||||
envVar = strings.TrimSpace(envVar)
|
|
||||||
if _, ok := syscall.Getenv(envVar); ok {
|
|
||||||
c.setFlags[name] = true
|
|
||||||
return
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return c.setFlags[name]
|
|
||||||
}
|
|
||||||
|
|
||||||
// GlobalIsSet determines if the global flag was actually set
|
|
||||||
func (c *Context) GlobalIsSet(name string) bool {
|
|
||||||
ctx := c
|
|
||||||
if ctx.parentContext != nil {
|
|
||||||
ctx = ctx.parentContext
|
|
||||||
}
|
|
||||||
|
|
||||||
for ; ctx != nil; ctx = ctx.parentContext {
|
|
||||||
if ctx.IsSet(name) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// FlagNames returns a slice of flag names used in this context.
|
|
||||||
func (c *Context) FlagNames() (names []string) {
|
|
||||||
for _, f := range c.Command.Flags {
|
|
||||||
name := strings.Split(f.GetName(), ",")[0]
|
|
||||||
if name == "help" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
names = append(names, name)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// GlobalFlagNames returns a slice of global flag names used by the app.
|
|
||||||
func (c *Context) GlobalFlagNames() (names []string) {
|
|
||||||
for _, f := range c.App.Flags {
|
|
||||||
name := strings.Split(f.GetName(), ",")[0]
|
|
||||||
if name == "help" || name == "version" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
names = append(names, name)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parent returns the parent context, if any
|
|
||||||
func (c *Context) Parent() *Context {
|
|
||||||
return c.parentContext
|
|
||||||
}
|
|
||||||
|
|
||||||
// value returns the value of the flag coressponding to `name`
|
|
||||||
func (c *Context) value(name string) interface{} {
|
|
||||||
return c.flagSet.Lookup(name).Value.(flag.Getter).Get()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Args contains apps console arguments
|
|
||||||
type Args []string
|
|
||||||
|
|
||||||
// Args returns the command line arguments associated with the context.
|
|
||||||
func (c *Context) Args() Args {
|
|
||||||
args := Args(c.flagSet.Args())
|
|
||||||
return args
|
|
||||||
}
|
|
||||||
|
|
||||||
// NArg returns the number of the command line arguments.
|
|
||||||
func (c *Context) NArg() int {
|
|
||||||
return len(c.Args())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get returns the nth argument, or else a blank string
|
|
||||||
func (a Args) Get(n int) string {
|
|
||||||
if len(a) > n {
|
|
||||||
return a[n]
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// First returns the first argument, or else a blank string
|
|
||||||
func (a Args) First() string {
|
|
||||||
return a.Get(0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tail returns the rest of the arguments (not the first one)
|
|
||||||
// or else an empty string slice
|
|
||||||
func (a Args) Tail() []string {
|
|
||||||
if len(a) >= 2 {
|
|
||||||
return []string(a)[1:]
|
|
||||||
}
|
|
||||||
return []string{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Present checks if there are any arguments present
|
|
||||||
func (a Args) Present() bool {
|
|
||||||
return len(a) != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swap swaps arguments at the given indexes
|
|
||||||
func (a Args) Swap(from, to int) error {
|
|
||||||
if from >= len(a) || to >= len(a) {
|
|
||||||
return errors.New("index out of range")
|
|
||||||
}
|
|
||||||
a[from], a[to] = a[to], a[from]
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func globalContext(ctx *Context) *Context {
|
|
||||||
if ctx == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
for {
|
|
||||||
if ctx.parentContext == nil {
|
|
||||||
return ctx
|
|
||||||
}
|
|
||||||
ctx = ctx.parentContext
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func lookupGlobalFlagSet(name string, ctx *Context) *flag.FlagSet {
|
|
||||||
if ctx.parentContext != nil {
|
|
||||||
ctx = ctx.parentContext
|
|
||||||
}
|
|
||||||
for ; ctx != nil; ctx = ctx.parentContext {
|
|
||||||
if f := ctx.flagSet.Lookup(name); f != nil {
|
|
||||||
return ctx.flagSet
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) {
|
|
||||||
switch ff.Value.(type) {
|
|
||||||
case *StringSlice:
|
|
||||||
default:
|
|
||||||
_ = set.Set(name, ff.Value.String())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func normalizeFlags(flags []Flag, set *flag.FlagSet) error {
|
|
||||||
visited := make(map[string]bool)
|
|
||||||
set.Visit(func(f *flag.Flag) {
|
|
||||||
visited[f.Name] = true
|
|
||||||
})
|
|
||||||
for _, f := range flags {
|
|
||||||
parts := strings.Split(f.GetName(), ",")
|
|
||||||
if len(parts) == 1 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
var ff *flag.Flag
|
|
||||||
for _, name := range parts {
|
|
||||||
name = strings.Trim(name, " ")
|
|
||||||
if visited[name] {
|
|
||||||
if ff != nil {
|
|
||||||
return errors.New("Cannot use two forms of the same flag: " + name + " " + ff.Name)
|
|
||||||
}
|
|
||||||
ff = set.Lookup(name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ff == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
for _, name := range parts {
|
|
||||||
name = strings.Trim(name, " ")
|
|
||||||
if !visited[name] {
|
|
||||||
copyFlag(name, ff, set)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type requiredFlagsErr interface {
|
|
||||||
error
|
|
||||||
getMissingFlags() []string
|
|
||||||
}
|
|
||||||
|
|
||||||
type errRequiredFlags struct {
|
|
||||||
missingFlags []string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *errRequiredFlags) Error() string {
|
|
||||||
numberOfMissingFlags := len(e.missingFlags)
|
|
||||||
if numberOfMissingFlags == 1 {
|
|
||||||
return fmt.Sprintf("Required flag %q not set", e.missingFlags[0])
|
|
||||||
}
|
|
||||||
joinedMissingFlags := strings.Join(e.missingFlags, ", ")
|
|
||||||
return fmt.Sprintf("Required flags %q not set", joinedMissingFlags)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *errRequiredFlags) getMissingFlags() []string {
|
|
||||||
return e.missingFlags
|
|
||||||
}
|
|
||||||
|
|
||||||
func checkRequiredFlags(flags []Flag, context *Context) requiredFlagsErr {
|
|
||||||
var missingFlags []string
|
|
||||||
for _, f := range flags {
|
|
||||||
if rf, ok := f.(RequiredFlag); ok && rf.IsRequired() {
|
|
||||||
var flagPresent bool
|
|
||||||
var flagName string
|
|
||||||
for _, key := range strings.Split(f.GetName(), ",") {
|
|
||||||
if len(key) > 1 {
|
|
||||||
flagName = key
|
|
||||||
}
|
|
||||||
|
|
||||||
if context.IsSet(strings.TrimSpace(key)) {
|
|
||||||
flagPresent = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !flagPresent && flagName != "" {
|
|
||||||
missingFlags = append(missingFlags, flagName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(missingFlags) != 0 {
|
|
||||||
return &errRequiredFlags{missingFlags: missingFlags}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
110
vendor/github.com/urfave/cli/flag_bool_t.go
generated
vendored
110
vendor/github.com/urfave/cli/flag_bool_t.go
generated
vendored
|
@ -1,110 +0,0 @@
|
||||||
package cli
|
|
||||||
|
|
||||||
import (
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
// BoolTFlag is a flag with type bool that is true by default
|
|
||||||
type BoolTFlag struct {
|
|
||||||
Name string
|
|
||||||
Usage string
|
|
||||||
EnvVar string
|
|
||||||
FilePath string
|
|
||||||
Required bool
|
|
||||||
Hidden bool
|
|
||||||
Destination *bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns a readable representation of this value
|
|
||||||
// (for usage defaults)
|
|
||||||
func (f BoolTFlag) String() string {
|
|
||||||
return FlagStringer(f)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetName returns the name of the flag
|
|
||||||
func (f BoolTFlag) GetName() string {
|
|
||||||
return f.Name
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsRequired returns whether or not the flag is required
|
|
||||||
func (f BoolTFlag) IsRequired() bool {
|
|
||||||
return f.Required
|
|
||||||
}
|
|
||||||
|
|
||||||
// TakesValue returns true of the flag takes a value, otherwise false
|
|
||||||
func (f BoolTFlag) TakesValue() bool {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetUsage returns the usage string for the flag
|
|
||||||
func (f BoolTFlag) GetUsage() string {
|
|
||||||
return f.Usage
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetValue returns the flags value as string representation and an empty
|
|
||||||
// string if the flag takes no value at all.
|
|
||||||
func (f BoolTFlag) GetValue() string {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoolT looks up the value of a local BoolTFlag, returns
|
|
||||||
// false if not found
|
|
||||||
func (c *Context) BoolT(name string) bool {
|
|
||||||
return lookupBoolT(name, c.flagSet)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GlobalBoolT looks up the value of a global BoolTFlag, returns
|
|
||||||
// false if not found
|
|
||||||
func (c *Context) GlobalBoolT(name string) bool {
|
|
||||||
if fs := lookupGlobalFlagSet(name, c); fs != nil {
|
|
||||||
return lookupBoolT(name, fs)
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
|
||||||
// Ignores errors
|
|
||||||
func (f BoolTFlag) Apply(set *flag.FlagSet) {
|
|
||||||
_ = f.ApplyWithError(set)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ApplyWithError populates the flag given the flag set and environment
|
|
||||||
func (f BoolTFlag) ApplyWithError(set *flag.FlagSet) error {
|
|
||||||
val := true
|
|
||||||
|
|
||||||
if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
|
|
||||||
if envVal == "" {
|
|
||||||
val = false
|
|
||||||
} else {
|
|
||||||
envValBool, err := strconv.ParseBool(envVal)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err)
|
|
||||||
}
|
|
||||||
val = envValBool
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
eachName(f.Name, func(name string) {
|
|
||||||
if f.Destination != nil {
|
|
||||||
set.BoolVar(f.Destination, name, val, f.Usage)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set.Bool(name, val, f.Usage)
|
|
||||||
})
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func lookupBoolT(name string, set *flag.FlagSet) bool {
|
|
||||||
f := set.Lookup(name)
|
|
||||||
if f != nil {
|
|
||||||
parsed, err := strconv.ParseBool(f.Value.String())
|
|
||||||
if err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return parsed
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
141
vendor/github.com/urfave/cli/flag_int64_slice.go
generated
vendored
141
vendor/github.com/urfave/cli/flag_int64_slice.go
generated
vendored
|
@ -1,141 +0,0 @@
|
||||||
package cli
|
|
||||||
|
|
||||||
import (
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Int64Slice is an opaque type for []int to satisfy flag.Value and flag.Getter
|
|
||||||
type Int64Slice []int64
|
|
||||||
|
|
||||||
// Set parses the value into an integer and appends it to the list of values
|
|
||||||
func (f *Int64Slice) Set(value string) error {
|
|
||||||
tmp, err := strconv.ParseInt(value, 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
*f = append(*f, tmp)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns a readable representation of this value (for usage defaults)
|
|
||||||
func (f *Int64Slice) String() string {
|
|
||||||
return fmt.Sprintf("%#v", *f)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Value returns the slice of ints set by this flag
|
|
||||||
func (f *Int64Slice) Value() []int64 {
|
|
||||||
return *f
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get returns the slice of ints set by this flag
|
|
||||||
func (f *Int64Slice) Get() interface{} {
|
|
||||||
return *f
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64SliceFlag is a flag with type *Int64Slice
|
|
||||||
type Int64SliceFlag struct {
|
|
||||||
Name string
|
|
||||||
Usage string
|
|
||||||
EnvVar string
|
|
||||||
FilePath string
|
|
||||||
Required bool
|
|
||||||
Hidden bool
|
|
||||||
Value *Int64Slice
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns a readable representation of this value
|
|
||||||
// (for usage defaults)
|
|
||||||
func (f Int64SliceFlag) String() string {
|
|
||||||
return FlagStringer(f)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetName returns the name of the flag
|
|
||||||
func (f Int64SliceFlag) GetName() string {
|
|
||||||
return f.Name
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsRequired returns whether or not the flag is required
|
|
||||||
func (f Int64SliceFlag) IsRequired() bool {
|
|
||||||
return f.Required
|
|
||||||
}
|
|
||||||
|
|
||||||
// TakesValue returns true of the flag takes a value, otherwise false
|
|
||||||
func (f Int64SliceFlag) TakesValue() bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetUsage returns the usage string for the flag
|
|
||||||
func (f Int64SliceFlag) GetUsage() string {
|
|
||||||
return f.Usage
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetValue returns the flags value as string representation and an empty
|
|
||||||
// string if the flag takes no value at all.
|
|
||||||
func (f Int64SliceFlag) GetValue() string {
|
|
||||||
if f.Value != nil {
|
|
||||||
return f.Value.String()
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
|
||||||
// Ignores errors
|
|
||||||
func (f Int64SliceFlag) Apply(set *flag.FlagSet) {
|
|
||||||
_ = f.ApplyWithError(set)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ApplyWithError populates the flag given the flag set and environment
|
|
||||||
func (f Int64SliceFlag) ApplyWithError(set *flag.FlagSet) error {
|
|
||||||
if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
|
|
||||||
newVal := &Int64Slice{}
|
|
||||||
for _, s := range strings.Split(envVal, ",") {
|
|
||||||
s = strings.TrimSpace(s)
|
|
||||||
if err := newVal.Set(s); err != nil {
|
|
||||||
return fmt.Errorf("could not parse %s as int64 slice value for flag %s: %s", envVal, f.Name, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if f.Value == nil {
|
|
||||||
f.Value = newVal
|
|
||||||
} else {
|
|
||||||
*f.Value = *newVal
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
eachName(f.Name, func(name string) {
|
|
||||||
if f.Value == nil {
|
|
||||||
f.Value = &Int64Slice{}
|
|
||||||
}
|
|
||||||
set.Var(f.Value, name, f.Usage)
|
|
||||||
})
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64Slice looks up the value of a local Int64SliceFlag, returns
|
|
||||||
// nil if not found
|
|
||||||
func (c *Context) Int64Slice(name string) []int64 {
|
|
||||||
return lookupInt64Slice(name, c.flagSet)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GlobalInt64Slice looks up the value of a global Int64SliceFlag, returns
|
|
||||||
// nil if not found
|
|
||||||
func (c *Context) GlobalInt64Slice(name string) []int64 {
|
|
||||||
if fs := lookupGlobalFlagSet(name, c); fs != nil {
|
|
||||||
return lookupInt64Slice(name, fs)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func lookupInt64Slice(name string, set *flag.FlagSet) []int64 {
|
|
||||||
f := set.Lookup(name)
|
|
||||||
if f != nil {
|
|
||||||
parsed, err := (f.Value.(*Int64Slice)).Value(), error(nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return parsed
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
142
vendor/github.com/urfave/cli/flag_int_slice.go
generated
vendored
142
vendor/github.com/urfave/cli/flag_int_slice.go
generated
vendored
|
@ -1,142 +0,0 @@
|
||||||
package cli
|
|
||||||
|
|
||||||
import (
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// IntSlice is an opaque type for []int to satisfy flag.Value and flag.Getter
|
|
||||||
type IntSlice []int
|
|
||||||
|
|
||||||
// Set parses the value into an integer and appends it to the list of values
|
|
||||||
func (f *IntSlice) Set(value string) error {
|
|
||||||
tmp, err := strconv.Atoi(value)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
*f = append(*f, tmp)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns a readable representation of this value (for usage defaults)
|
|
||||||
func (f *IntSlice) String() string {
|
|
||||||
return fmt.Sprintf("%#v", *f)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Value returns the slice of ints set by this flag
|
|
||||||
func (f *IntSlice) Value() []int {
|
|
||||||
return *f
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get returns the slice of ints set by this flag
|
|
||||||
func (f *IntSlice) Get() interface{} {
|
|
||||||
return *f
|
|
||||||
}
|
|
||||||
|
|
||||||
// IntSliceFlag is a flag with type *IntSlice
|
|
||||||
type IntSliceFlag struct {
|
|
||||||
Name string
|
|
||||||
Usage string
|
|
||||||
EnvVar string
|
|
||||||
FilePath string
|
|
||||||
Required bool
|
|
||||||
Hidden bool
|
|
||||||
Value *IntSlice
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns a readable representation of this value
|
|
||||||
// (for usage defaults)
|
|
||||||
func (f IntSliceFlag) String() string {
|
|
||||||
return FlagStringer(f)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetName returns the name of the flag
|
|
||||||
func (f IntSliceFlag) GetName() string {
|
|
||||||
return f.Name
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsRequired returns whether or not the flag is required
|
|
||||||
func (f IntSliceFlag) IsRequired() bool {
|
|
||||||
return f.Required
|
|
||||||
}
|
|
||||||
|
|
||||||
// TakesValue returns true of the flag takes a value, otherwise false
|
|
||||||
func (f IntSliceFlag) TakesValue() bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetUsage returns the usage string for the flag
|
|
||||||
func (f IntSliceFlag) GetUsage() string {
|
|
||||||
return f.Usage
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetValue returns the flags value as string representation and an empty
|
|
||||||
// string if the flag takes no value at all.
|
|
||||||
func (f IntSliceFlag) GetValue() string {
|
|
||||||
if f.Value != nil {
|
|
||||||
return f.Value.String()
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
|
||||||
// Ignores errors
|
|
||||||
func (f IntSliceFlag) Apply(set *flag.FlagSet) {
|
|
||||||
_ = f.ApplyWithError(set)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ApplyWithError populates the flag given the flag set and environment
|
|
||||||
func (f IntSliceFlag) ApplyWithError(set *flag.FlagSet) error {
|
|
||||||
if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
|
|
||||||
newVal := &IntSlice{}
|
|
||||||
for _, s := range strings.Split(envVal, ",") {
|
|
||||||
s = strings.TrimSpace(s)
|
|
||||||
if err := newVal.Set(s); err != nil {
|
|
||||||
return fmt.Errorf("could not parse %s as int slice value for flag %s: %s", envVal, f.Name, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if f.Value == nil {
|
|
||||||
f.Value = newVal
|
|
||||||
} else {
|
|
||||||
*f.Value = *newVal
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
eachName(f.Name, func(name string) {
|
|
||||||
if f.Value == nil {
|
|
||||||
f.Value = &IntSlice{}
|
|
||||||
}
|
|
||||||
set.Var(f.Value, name, f.Usage)
|
|
||||||
})
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// IntSlice looks up the value of a local IntSliceFlag, returns
|
|
||||||
// nil if not found
|
|
||||||
func (c *Context) IntSlice(name string) []int {
|
|
||||||
return lookupIntSlice(name, c.flagSet)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GlobalIntSlice looks up the value of a global IntSliceFlag, returns
|
|
||||||
// nil if not found
|
|
||||||
func (c *Context) GlobalIntSlice(name string) []int {
|
|
||||||
if fs := lookupGlobalFlagSet(name, c); fs != nil {
|
|
||||||
return lookupIntSlice(name, fs)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func lookupIntSlice(name string, set *flag.FlagSet) []int {
|
|
||||||
f := set.Lookup(name)
|
|
||||||
if f != nil {
|
|
||||||
parsed, err := (f.Value.(*IntSlice)).Value(), error(nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return parsed
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
138
vendor/github.com/urfave/cli/flag_string_slice.go
generated
vendored
138
vendor/github.com/urfave/cli/flag_string_slice.go
generated
vendored
|
@ -1,138 +0,0 @@
|
||||||
package cli
|
|
||||||
|
|
||||||
import (
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// StringSlice is an opaque type for []string to satisfy flag.Value and flag.Getter
|
|
||||||
type StringSlice []string
|
|
||||||
|
|
||||||
// Set appends the string value to the list of values
|
|
||||||
func (f *StringSlice) Set(value string) error {
|
|
||||||
*f = append(*f, value)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns a readable representation of this value (for usage defaults)
|
|
||||||
func (f *StringSlice) String() string {
|
|
||||||
return fmt.Sprintf("%s", *f)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Value returns the slice of strings set by this flag
|
|
||||||
func (f *StringSlice) Value() []string {
|
|
||||||
return *f
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get returns the slice of strings set by this flag
|
|
||||||
func (f *StringSlice) Get() interface{} {
|
|
||||||
return *f
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringSliceFlag is a flag with type *StringSlice
|
|
||||||
type StringSliceFlag struct {
|
|
||||||
Name string
|
|
||||||
Usage string
|
|
||||||
EnvVar string
|
|
||||||
FilePath string
|
|
||||||
Required bool
|
|
||||||
Hidden bool
|
|
||||||
TakesFile bool
|
|
||||||
Value *StringSlice
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns a readable representation of this value
|
|
||||||
// (for usage defaults)
|
|
||||||
func (f StringSliceFlag) String() string {
|
|
||||||
return FlagStringer(f)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetName returns the name of the flag
|
|
||||||
func (f StringSliceFlag) GetName() string {
|
|
||||||
return f.Name
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsRequired returns whether or not the flag is required
|
|
||||||
func (f StringSliceFlag) IsRequired() bool {
|
|
||||||
return f.Required
|
|
||||||
}
|
|
||||||
|
|
||||||
// TakesValue returns true of the flag takes a value, otherwise false
|
|
||||||
func (f StringSliceFlag) TakesValue() bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetUsage returns the usage string for the flag
|
|
||||||
func (f StringSliceFlag) GetUsage() string {
|
|
||||||
return f.Usage
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetValue returns the flags value as string representation and an empty
|
|
||||||
// string if the flag takes no value at all.
|
|
||||||
func (f StringSliceFlag) GetValue() string {
|
|
||||||
if f.Value != nil {
|
|
||||||
return f.Value.String()
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
|
||||||
// Ignores errors
|
|
||||||
func (f StringSliceFlag) Apply(set *flag.FlagSet) {
|
|
||||||
_ = f.ApplyWithError(set)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ApplyWithError populates the flag given the flag set and environment
|
|
||||||
func (f StringSliceFlag) ApplyWithError(set *flag.FlagSet) error {
|
|
||||||
if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
|
|
||||||
newVal := &StringSlice{}
|
|
||||||
for _, s := range strings.Split(envVal, ",") {
|
|
||||||
s = strings.TrimSpace(s)
|
|
||||||
if err := newVal.Set(s); err != nil {
|
|
||||||
return fmt.Errorf("could not parse %s as string value for flag %s: %s", envVal, f.Name, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if f.Value == nil {
|
|
||||||
f.Value = newVal
|
|
||||||
} else {
|
|
||||||
*f.Value = *newVal
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
eachName(f.Name, func(name string) {
|
|
||||||
if f.Value == nil {
|
|
||||||
f.Value = &StringSlice{}
|
|
||||||
}
|
|
||||||
set.Var(f.Value, name, f.Usage)
|
|
||||||
})
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringSlice looks up the value of a local StringSliceFlag, returns
|
|
||||||
// nil if not found
|
|
||||||
func (c *Context) StringSlice(name string) []string {
|
|
||||||
return lookupStringSlice(name, c.flagSet)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GlobalStringSlice looks up the value of a global StringSliceFlag, returns
|
|
||||||
// nil if not found
|
|
||||||
func (c *Context) GlobalStringSlice(name string) []string {
|
|
||||||
if fs := lookupGlobalFlagSet(name, c); fs != nil {
|
|
||||||
return lookupStringSlice(name, fs)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func lookupStringSlice(name string, set *flag.FlagSet) []string {
|
|
||||||
f := set.Lookup(name)
|
|
||||||
if f != nil {
|
|
||||||
parsed, err := (f.Value.(*StringSlice)).Value(), error(nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return parsed
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
0
vendor/github.com/urfave/cli/.flake8 → vendor/github.com/urfave/cli/v2/.flake8
generated
vendored
0
vendor/github.com/urfave/cli/.flake8 → vendor/github.com/urfave/cli/v2/.flake8
generated
vendored
4
vendor/github.com/urfave/cli/.gitignore → vendor/github.com/urfave/cli/v2/.gitignore
generated
vendored
4
vendor/github.com/urfave/cli/.gitignore → vendor/github.com/urfave/cli/v2/.gitignore
generated
vendored
|
@ -1,3 +1,5 @@
|
||||||
*.coverprofile
|
*.coverprofile
|
||||||
|
*.orig
|
||||||
node_modules/
|
node_modules/
|
||||||
vendor
|
vendor
|
||||||
|
.idea
|
0
vendor/github.com/urfave/cli/LICENSE → vendor/github.com/urfave/cli/v2/LICENSE
generated
vendored
0
vendor/github.com/urfave/cli/LICENSE → vendor/github.com/urfave/cli/v2/LICENSE
generated
vendored
72
vendor/github.com/urfave/cli/README.md → vendor/github.com/urfave/cli/v2/README.md
generated
vendored
72
vendor/github.com/urfave/cli/README.md → vendor/github.com/urfave/cli/v2/README.md
generated
vendored
|
@ -1,7 +1,6 @@
|
||||||
cli
|
cli
|
||||||
===
|
===
|
||||||
|
|
||||||
[![Build Status](https://travis-ci.org/urfave/cli.svg?branch=master)](https://travis-ci.org/urfave/cli)
|
|
||||||
[![Windows Build Status](https://ci.appveyor.com/api/projects/status/rtgk5xufi932pb2v?svg=true)](https://ci.appveyor.com/project/urfave/cli)
|
[![Windows Build Status](https://ci.appveyor.com/api/projects/status/rtgk5xufi932pb2v?svg=true)](https://ci.appveyor.com/project/urfave/cli)
|
||||||
|
|
||||||
[![GoDoc](https://godoc.org/github.com/urfave/cli?status.svg)](https://godoc.org/github.com/urfave/cli)
|
[![GoDoc](https://godoc.org/github.com/urfave/cli?status.svg)](https://godoc.org/github.com/urfave/cli)
|
||||||
|
@ -15,15 +14,44 @@ applications in an expressive way.
|
||||||
|
|
||||||
## Usage Documentation
|
## Usage Documentation
|
||||||
|
|
||||||
Usage documentation exists for each major version
|
Usage documentation exists for each major version. Don't know what version you're on? You're probably using the version from the `master` branch, which is currently `v2`.
|
||||||
|
|
||||||
|
- `v2` - [./docs/v2/manual.md](./docs/v2/manual.md)
|
||||||
- `v1` - [./docs/v1/manual.md](./docs/v1/manual.md)
|
- `v1` - [./docs/v1/manual.md](./docs/v1/manual.md)
|
||||||
- `v2` - 🚧 documentation for `v2` is WIP 🚧
|
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
Make sure you have a working Go environment. Go version 1.10+ is supported. [See
|
Make sure you have a working Go environment. Go version 1.11+ is supported. [See the install instructions for Go](http://golang.org/doc/install.html).
|
||||||
the install instructions for Go](http://golang.org/doc/install.html).
|
|
||||||
|
Go Modules are strongly recommended when using this package. [See the go blog guide on using Go Modules](https://blog.golang.org/using-go-modules).
|
||||||
|
|
||||||
|
### Using `v2` releases
|
||||||
|
|
||||||
|
```
|
||||||
|
$ GO111MODULE=on go get github.com/urfave/cli/v2
|
||||||
|
```
|
||||||
|
|
||||||
|
```go
|
||||||
|
...
|
||||||
|
import (
|
||||||
|
"github.com/urfave/cli/v2" // imports as package "cli"
|
||||||
|
)
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using `v1` releases
|
||||||
|
|
||||||
|
```
|
||||||
|
$ GO111MODULE=on go get github.com/urfave/cli
|
||||||
|
```
|
||||||
|
|
||||||
|
```go
|
||||||
|
...
|
||||||
|
import (
|
||||||
|
"github.com/urfave/cli"
|
||||||
|
)
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
### GOPATH
|
### GOPATH
|
||||||
|
|
||||||
|
@ -36,35 +64,5 @@ export PATH=$PATH:$GOPATH/bin
|
||||||
### Supported platforms
|
### Supported platforms
|
||||||
|
|
||||||
cli is tested against multiple versions of Go on Linux, and against the latest
|
cli is tested against multiple versions of Go on Linux, and against the latest
|
||||||
released version of Go on OS X and Windows. For full details, see
|
released version of Go on OS X and Windows. This project uses Github Actions for
|
||||||
[`./.travis.yml`](./.travis.yml) and [`./appveyor.yml`](./appveyor.yml).
|
builds. For more build info, please look at the [./.github/workflows/cli.yml](https://github.com/urfave/cli/blob/master/.github/workflows/cli.yml).
|
||||||
|
|
||||||
### Using `v1` releases
|
|
||||||
|
|
||||||
```
|
|
||||||
$ go get github.com/urfave/cli
|
|
||||||
```
|
|
||||||
|
|
||||||
```go
|
|
||||||
...
|
|
||||||
import (
|
|
||||||
"github.com/urfave/cli"
|
|
||||||
)
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
### Using `v2` releases
|
|
||||||
|
|
||||||
**Warning**: `v2` is in a pre-release state.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ go get github.com/urfave/cli.v2
|
|
||||||
```
|
|
||||||
|
|
||||||
```go
|
|
||||||
...
|
|
||||||
import (
|
|
||||||
"github.com/urfave/cli.v2" // imports as package "cli"
|
|
||||||
)
|
|
||||||
...
|
|
||||||
```
|
|
154
vendor/github.com/urfave/cli/app.go → vendor/github.com/urfave/cli/v2/app.go
generated
vendored
154
vendor/github.com/urfave/cli/app.go → vendor/github.com/urfave/cli/v2/app.go
generated
vendored
|
@ -1,24 +1,22 @@
|
||||||
package cli
|
package cli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
changeLogURL = "https://github.com/urfave/cli/blob/master/CHANGELOG.md"
|
changeLogURL = "https://github.com/urfave/cli/blob/master/docs/CHANGELOG.md"
|
||||||
appActionDeprecationURL = fmt.Sprintf("%s#deprecated-cli-app-action-signature", changeLogURL)
|
appActionDeprecationURL = fmt.Sprintf("%s#deprecated-cli-app-action-signature", changeLogURL)
|
||||||
// unused variable. commented for now. will remove in future if agreed upon by everyone
|
contactSysadmin = "This is an error in the application. Please contact the distributor of this application if this is not you."
|
||||||
//runAndExitOnErrorDeprecationURL = fmt.Sprintf("%s#deprecated-cli-app-runandexitonerror", changeLogURL)
|
errInvalidActionType = NewExitError("ERROR invalid Action type. "+
|
||||||
|
|
||||||
contactSysadmin = "This is an error in the application. Please contact the distributor of this application if this is not you."
|
|
||||||
|
|
||||||
errInvalidActionType = NewExitError("ERROR invalid Action type. "+
|
|
||||||
fmt.Sprintf("Must be `func(*Context`)` or `func(*Context) error). %s", contactSysadmin)+
|
fmt.Sprintf("Must be `func(*Context`)` or `func(*Context) error). %s", contactSysadmin)+
|
||||||
fmt.Sprintf("See %s", appActionDeprecationURL), 2)
|
fmt.Sprintf("See %s", appActionDeprecationURL), 2)
|
||||||
)
|
)
|
||||||
|
@ -41,7 +39,7 @@ type App struct {
|
||||||
// Description of the program
|
// Description of the program
|
||||||
Description string
|
Description string
|
||||||
// List of commands to execute
|
// List of commands to execute
|
||||||
Commands []Command
|
Commands []*Command
|
||||||
// List of flags to parse
|
// List of flags to parse
|
||||||
Flags []Flag
|
Flags []Flag
|
||||||
// Boolean to enable bash completion commands
|
// Boolean to enable bash completion commands
|
||||||
|
@ -50,9 +48,9 @@ type App struct {
|
||||||
HideHelp bool
|
HideHelp bool
|
||||||
// Boolean to hide built-in version flag and the VERSION section of help
|
// Boolean to hide built-in version flag and the VERSION section of help
|
||||||
HideVersion bool
|
HideVersion bool
|
||||||
// Populate on app startup, only gettable through method Categories()
|
// categories contains the categorized commands and is populated on app startup
|
||||||
categories CommandCategories
|
categories CommandCategories
|
||||||
// An action to execute when the bash-completion flag is set
|
// An action to execute when the shell completion flag is set
|
||||||
BashComplete BashCompleteFunc
|
BashComplete BashCompleteFunc
|
||||||
// An action to execute before any subcommands are run, but after the context is ready
|
// An action to execute before any subcommands are run, but after the context is ready
|
||||||
// If a non-nil error is returned, no subcommands are run
|
// If a non-nil error is returned, no subcommands are run
|
||||||
|
@ -60,12 +58,8 @@ type App struct {
|
||||||
// An action to execute after any subcommands are run, but after the subcommand has finished
|
// An action to execute after any subcommands are run, but after the subcommand has finished
|
||||||
// It is run even if Action() panics
|
// It is run even if Action() panics
|
||||||
After AfterFunc
|
After AfterFunc
|
||||||
|
|
||||||
// The action to execute when no subcommands are specified
|
// The action to execute when no subcommands are specified
|
||||||
// Expects a `cli.ActionFunc` but will accept the *deprecated* signature of `func(*cli.Context) {}`
|
Action ActionFunc
|
||||||
// *Note*: support for the deprecated `Action` signature will be removed in a future version
|
|
||||||
Action interface{}
|
|
||||||
|
|
||||||
// Execute this function if the proper command cannot be found
|
// Execute this function if the proper command cannot be found
|
||||||
CommandNotFound CommandNotFoundFunc
|
CommandNotFound CommandNotFoundFunc
|
||||||
// Execute this function if an usage error occurs
|
// Execute this function if an usage error occurs
|
||||||
|
@ -73,13 +67,9 @@ type App struct {
|
||||||
// Compilation date
|
// Compilation date
|
||||||
Compiled time.Time
|
Compiled time.Time
|
||||||
// List of all authors who contributed
|
// List of all authors who contributed
|
||||||
Authors []Author
|
Authors []*Author
|
||||||
// Copyright of the binary if any
|
// Copyright of the binary if any
|
||||||
Copyright string
|
Copyright string
|
||||||
// Name of Author (Note: Use App.Authors, this is deprecated)
|
|
||||||
Author string
|
|
||||||
// Email of Author (Note: Use App.Authors, this is deprecated)
|
|
||||||
Email string
|
|
||||||
// Writer writer to write output to
|
// Writer writer to write output to
|
||||||
Writer io.Writer
|
Writer io.Writer
|
||||||
// ErrWriter writes error output
|
// ErrWriter writes error output
|
||||||
|
@ -96,7 +86,7 @@ type App struct {
|
||||||
// render custom help text by setting this variable.
|
// render custom help text by setting this variable.
|
||||||
CustomAppHelpTemplate string
|
CustomAppHelpTemplate string
|
||||||
// Boolean to enable short-option handling so user can combine several
|
// Boolean to enable short-option handling so user can combine several
|
||||||
// single-character bool arguements into one
|
// single-character bool arguments into one
|
||||||
// i.e. foobar -o -v -> foobar -ov
|
// i.e. foobar -o -v -> foobar -ov
|
||||||
UseShortOptionHandling bool
|
UseShortOptionHandling bool
|
||||||
|
|
||||||
|
@ -121,7 +111,6 @@ func NewApp() *App {
|
||||||
HelpName: filepath.Base(os.Args[0]),
|
HelpName: filepath.Base(os.Args[0]),
|
||||||
Usage: "A new cli application",
|
Usage: "A new cli application",
|
||||||
UsageText: "",
|
UsageText: "",
|
||||||
Version: "0.0.0",
|
|
||||||
BashComplete: DefaultAppComplete,
|
BashComplete: DefaultAppComplete,
|
||||||
Action: helpCommand.Action,
|
Action: helpCommand.Action,
|
||||||
Compiled: compileTime(),
|
Compiled: compileTime(),
|
||||||
|
@ -139,22 +128,52 @@ func (a *App) Setup() {
|
||||||
|
|
||||||
a.didSetup = true
|
a.didSetup = true
|
||||||
|
|
||||||
if a.Author != "" || a.Email != "" {
|
if a.Name == "" {
|
||||||
a.Authors = append(a.Authors, Author{Name: a.Author, Email: a.Email})
|
a.Name = filepath.Base(os.Args[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
var newCmds []Command
|
if a.HelpName == "" {
|
||||||
|
a.HelpName = filepath.Base(os.Args[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
if a.Usage == "" {
|
||||||
|
a.Usage = "A new cli application"
|
||||||
|
}
|
||||||
|
|
||||||
|
if a.Version == "" {
|
||||||
|
a.HideVersion = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if a.BashComplete == nil {
|
||||||
|
a.BashComplete = DefaultAppComplete
|
||||||
|
}
|
||||||
|
|
||||||
|
if a.Action == nil {
|
||||||
|
a.Action = helpCommand.Action
|
||||||
|
}
|
||||||
|
|
||||||
|
if a.Compiled == (time.Time{}) {
|
||||||
|
a.Compiled = compileTime()
|
||||||
|
}
|
||||||
|
|
||||||
|
if a.Writer == nil {
|
||||||
|
a.Writer = os.Stdout
|
||||||
|
}
|
||||||
|
|
||||||
|
var newCommands []*Command
|
||||||
|
|
||||||
for _, c := range a.Commands {
|
for _, c := range a.Commands {
|
||||||
if c.HelpName == "" {
|
if c.HelpName == "" {
|
||||||
c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name)
|
c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name)
|
||||||
}
|
}
|
||||||
newCmds = append(newCmds, c)
|
newCommands = append(newCommands, c)
|
||||||
}
|
}
|
||||||
a.Commands = newCmds
|
a.Commands = newCommands
|
||||||
|
|
||||||
if a.Command(helpCommand.Name) == nil && !a.HideHelp {
|
if a.Command(helpCommand.Name) == nil && !a.HideHelp {
|
||||||
a.Commands = append(a.Commands, helpCommand)
|
a.appendCommand(helpCommand)
|
||||||
if (HelpFlag != BoolFlag{}) {
|
|
||||||
|
if HelpFlag != nil {
|
||||||
a.appendFlag(HelpFlag)
|
a.appendFlag(HelpFlag)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -163,11 +182,11 @@ func (a *App) Setup() {
|
||||||
a.appendFlag(VersionFlag)
|
a.appendFlag(VersionFlag)
|
||||||
}
|
}
|
||||||
|
|
||||||
a.categories = CommandCategories{}
|
a.categories = newCommandCategories()
|
||||||
for _, command := range a.Commands {
|
for _, command := range a.Commands {
|
||||||
a.categories = a.categories.AddCommand(command.Category, command)
|
a.categories.AddCommand(command.Category, command)
|
||||||
}
|
}
|
||||||
sort.Sort(a.categories)
|
sort.Sort(a.categories.(*commandCategories))
|
||||||
|
|
||||||
if a.Metadata == nil {
|
if a.Metadata == nil {
|
||||||
a.Metadata = make(map[string]interface{})
|
a.Metadata = make(map[string]interface{})
|
||||||
|
@ -189,6 +208,13 @@ func (a *App) useShortOptionHandling() bool {
|
||||||
// Run is the entry point to the cli app. Parses the arguments slice and routes
|
// Run is the entry point to the cli app. Parses the arguments slice and routes
|
||||||
// to the proper flag/args combination
|
// to the proper flag/args combination
|
||||||
func (a *App) Run(arguments []string) (err error) {
|
func (a *App) Run(arguments []string) (err error) {
|
||||||
|
return a.RunContext(context.Background(), arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RunContext is like Run except it takes a Context that will be
|
||||||
|
// passed to its commands and sub-commands. Through this, you can
|
||||||
|
// propagate timeouts and cancellation requests
|
||||||
|
func (a *App) RunContext(ctx context.Context, arguments []string) (err error) {
|
||||||
a.Setup()
|
a.Setup()
|
||||||
|
|
||||||
// handle the completion flag separately from the flagset since
|
// handle the completion flag separately from the flagset since
|
||||||
|
@ -204,9 +230,9 @@ func (a *App) Run(arguments []string) (err error) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = parseIter(set, a, arguments[1:])
|
err = parseIter(set, a, arguments[1:], shellComplete)
|
||||||
nerr := normalizeFlags(a.Flags, set)
|
nerr := normalizeFlags(a.Flags, set)
|
||||||
context := NewContext(a, set, nil)
|
context := NewContext(a, set, &Context{Context: ctx})
|
||||||
if nerr != nil {
|
if nerr != nil {
|
||||||
_, _ = fmt.Fprintln(a.Writer, nerr)
|
_, _ = fmt.Fprintln(a.Writer, nerr)
|
||||||
_ = ShowAppHelp(context)
|
_ = ShowAppHelp(context)
|
||||||
|
@ -249,7 +275,7 @@ func (a *App) Run(arguments []string) (err error) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if afterErr := a.After(context); afterErr != nil {
|
if afterErr := a.After(context); afterErr != nil {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = NewMultiError(err, afterErr)
|
err = newMultiError(err, afterErr)
|
||||||
} else {
|
} else {
|
||||||
err = afterErr
|
err = afterErr
|
||||||
}
|
}
|
||||||
|
@ -282,7 +308,7 @@ func (a *App) Run(arguments []string) (err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run default Action
|
// Run default Action
|
||||||
err = HandleAction(a.Action, context)
|
err = a.Action(context)
|
||||||
|
|
||||||
a.handleExitCoder(context, err)
|
a.handleExitCoder(context, err)
|
||||||
return err
|
return err
|
||||||
|
@ -303,17 +329,20 @@ func (a *App) RunAndExitOnError() {
|
||||||
// RunAsSubcommand invokes the subcommand given the context, parses ctx.Args() to
|
// RunAsSubcommand invokes the subcommand given the context, parses ctx.Args() to
|
||||||
// generate command-specific flags
|
// generate command-specific flags
|
||||||
func (a *App) RunAsSubcommand(ctx *Context) (err error) {
|
func (a *App) RunAsSubcommand(ctx *Context) (err error) {
|
||||||
|
a.Setup()
|
||||||
|
|
||||||
// append help to commands
|
// append help to commands
|
||||||
if len(a.Commands) > 0 {
|
if len(a.Commands) > 0 {
|
||||||
if a.Command(helpCommand.Name) == nil && !a.HideHelp {
|
if a.Command(helpCommand.Name) == nil && !a.HideHelp {
|
||||||
a.Commands = append(a.Commands, helpCommand)
|
a.appendCommand(helpCommand)
|
||||||
if (HelpFlag != BoolFlag{}) {
|
|
||||||
|
if HelpFlag != nil {
|
||||||
a.appendFlag(HelpFlag)
|
a.appendFlag(HelpFlag)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
newCmds := []Command{}
|
var newCmds []*Command
|
||||||
for _, c := range a.Commands {
|
for _, c := range a.Commands {
|
||||||
if c.HelpName == "" {
|
if c.HelpName == "" {
|
||||||
c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name)
|
c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name)
|
||||||
|
@ -327,7 +356,7 @@ func (a *App) RunAsSubcommand(ctx *Context) (err error) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = parseIter(set, a, ctx.Args().Tail())
|
err = parseIter(set, a, ctx.Args().Tail(), ctx.shellComplete)
|
||||||
nerr := normalizeFlags(a.Flags, set)
|
nerr := normalizeFlags(a.Flags, set)
|
||||||
context := NewContext(a, set, ctx)
|
context := NewContext(a, set, ctx)
|
||||||
|
|
||||||
|
@ -379,7 +408,7 @@ func (a *App) RunAsSubcommand(ctx *Context) (err error) {
|
||||||
if afterErr != nil {
|
if afterErr != nil {
|
||||||
a.handleExitCoder(context, err)
|
a.handleExitCoder(context, err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = NewMultiError(err, afterErr)
|
err = newMultiError(err, afterErr)
|
||||||
} else {
|
} else {
|
||||||
err = afterErr
|
err = afterErr
|
||||||
}
|
}
|
||||||
|
@ -406,7 +435,7 @@ func (a *App) RunAsSubcommand(ctx *Context) (err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run default Action
|
// Run default Action
|
||||||
err = HandleAction(a.Action, context)
|
err = a.Action(context)
|
||||||
|
|
||||||
a.handleExitCoder(context, err)
|
a.handleExitCoder(context, err)
|
||||||
return err
|
return err
|
||||||
|
@ -416,28 +445,21 @@ func (a *App) RunAsSubcommand(ctx *Context) (err error) {
|
||||||
func (a *App) Command(name string) *Command {
|
func (a *App) Command(name string) *Command {
|
||||||
for _, c := range a.Commands {
|
for _, c := range a.Commands {
|
||||||
if c.HasName(name) {
|
if c.HasName(name) {
|
||||||
return &c
|
return c
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Categories returns a slice containing all the categories with the commands they contain
|
|
||||||
func (a *App) Categories() CommandCategories {
|
|
||||||
return a.categories
|
|
||||||
}
|
|
||||||
|
|
||||||
// VisibleCategories returns a slice of categories and commands that are
|
// VisibleCategories returns a slice of categories and commands that are
|
||||||
// Hidden=false
|
// Hidden=false
|
||||||
func (a *App) VisibleCategories() []*CommandCategory {
|
func (a *App) VisibleCategories() []CommandCategory {
|
||||||
ret := []*CommandCategory{}
|
ret := []CommandCategory{}
|
||||||
for _, category := range a.categories {
|
for _, category := range a.categories.Categories() {
|
||||||
if visible := func() *CommandCategory {
|
if visible := func() CommandCategory {
|
||||||
for _, command := range category.Commands {
|
if len(category.VisibleCommands()) > 0 {
|
||||||
if !command.Hidden {
|
return category
|
||||||
return category
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}(); visible != nil {
|
}(); visible != nil {
|
||||||
|
@ -448,8 +470,8 @@ func (a *App) VisibleCategories() []*CommandCategory {
|
||||||
}
|
}
|
||||||
|
|
||||||
// VisibleCommands returns a slice of the Commands with Hidden=false
|
// VisibleCommands returns a slice of the Commands with Hidden=false
|
||||||
func (a *App) VisibleCommands() []Command {
|
func (a *App) VisibleCommands() []*Command {
|
||||||
var ret []Command
|
var ret []*Command
|
||||||
for _, command := range a.Commands {
|
for _, command := range a.Commands {
|
||||||
if !command.Hidden {
|
if !command.Hidden {
|
||||||
ret = append(ret, command)
|
ret = append(ret, command)
|
||||||
|
@ -465,7 +487,7 @@ func (a *App) VisibleFlags() []Flag {
|
||||||
|
|
||||||
func (a *App) hasFlag(flag Flag) bool {
|
func (a *App) hasFlag(flag Flag) bool {
|
||||||
for _, f := range a.Flags {
|
for _, f := range a.Flags {
|
||||||
if flag == f {
|
if reflect.DeepEqual(flag, f) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -482,9 +504,15 @@ func (a *App) errWriter() io.Writer {
|
||||||
return a.ErrWriter
|
return a.ErrWriter
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) appendFlag(flag Flag) {
|
func (a *App) appendFlag(fl Flag) {
|
||||||
if !a.hasFlag(flag) {
|
if !hasFlag(a.Flags, fl) {
|
||||||
a.Flags = append(a.Flags, flag)
|
a.Flags = append(a.Flags, fl)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *App) appendCommand(c *Command) {
|
||||||
|
if !hasCommand(a.Commands, c) {
|
||||||
|
a.Commands = append(a.Commands, c)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -503,7 +531,7 @@ type Author struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// String makes Author comply to the Stringer interface, to allow an easy print in the templating process
|
// String makes Author comply to the Stringer interface, to allow an easy print in the templating process
|
||||||
func (a Author) String() string {
|
func (a *Author) String() string {
|
||||||
e := ""
|
e := ""
|
||||||
if a.Email != "" {
|
if a.Email != "" {
|
||||||
e = " <" + a.Email + ">"
|
e = " <" + a.Email + ">"
|
|
@ -20,7 +20,7 @@ install:
|
||||||
- go version
|
- go version
|
||||||
- go env
|
- go env
|
||||||
- go get github.com/urfave/gfmrun/cmd/gfmrun
|
- go get github.com/urfave/gfmrun/cmd/gfmrun
|
||||||
- go mod vendor
|
- go mod tidy
|
||||||
|
|
||||||
build_script:
|
build_script:
|
||||||
- go run build.go vet
|
- go run build.go vet
|
54
vendor/github.com/urfave/cli/v2/args.go
generated
vendored
Normal file
54
vendor/github.com/urfave/cli/v2/args.go
generated
vendored
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
package cli
|
||||||
|
|
||||||
|
type Args interface {
|
||||||
|
// Get returns the nth argument, or else a blank string
|
||||||
|
Get(n int) string
|
||||||
|
// First returns the first argument, or else a blank string
|
||||||
|
First() string
|
||||||
|
// Tail returns the rest of the arguments (not the first one)
|
||||||
|
// or else an empty string slice
|
||||||
|
Tail() []string
|
||||||
|
// Len returns the length of the wrapped slice
|
||||||
|
Len() int
|
||||||
|
// Present checks if there are any arguments present
|
||||||
|
Present() bool
|
||||||
|
// Slice returns a copy of the internal slice
|
||||||
|
Slice() []string
|
||||||
|
}
|
||||||
|
|
||||||
|
type args []string
|
||||||
|
|
||||||
|
func (a *args) Get(n int) string {
|
||||||
|
if len(*a) > n {
|
||||||
|
return (*a)[n]
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *args) First() string {
|
||||||
|
return a.Get(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *args) Tail() []string {
|
||||||
|
if a.Len() >= 2 {
|
||||||
|
tail := []string((*a)[1:])
|
||||||
|
ret := make([]string, len(tail))
|
||||||
|
copy(ret, tail)
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *args) Len() int {
|
||||||
|
return len(*a)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *args) Present() bool {
|
||||||
|
return a.Len() != 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *args) Slice() []string {
|
||||||
|
ret := make([]string, len(*a))
|
||||||
|
copy(ret, *a)
|
||||||
|
return ret
|
||||||
|
}
|
79
vendor/github.com/urfave/cli/v2/category.go
generated
vendored
Normal file
79
vendor/github.com/urfave/cli/v2/category.go
generated
vendored
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
package cli
|
||||||
|
|
||||||
|
// CommandCategories interface allows for category manipulation
|
||||||
|
type CommandCategories interface {
|
||||||
|
// AddCommand adds a command to a category, creating a new category if necessary.
|
||||||
|
AddCommand(category string, command *Command)
|
||||||
|
// categories returns a copy of the category slice
|
||||||
|
Categories() []CommandCategory
|
||||||
|
}
|
||||||
|
|
||||||
|
type commandCategories []*commandCategory
|
||||||
|
|
||||||
|
func newCommandCategories() CommandCategories {
|
||||||
|
ret := commandCategories([]*commandCategory{})
|
||||||
|
return &ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *commandCategories) Less(i, j int) bool {
|
||||||
|
return lexicographicLess((*c)[i].Name(), (*c)[j].Name())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *commandCategories) Len() int {
|
||||||
|
return len(*c)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *commandCategories) Swap(i, j int) {
|
||||||
|
(*c)[i], (*c)[j] = (*c)[j], (*c)[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *commandCategories) AddCommand(category string, command *Command) {
|
||||||
|
for _, commandCategory := range []*commandCategory(*c) {
|
||||||
|
if commandCategory.name == category {
|
||||||
|
commandCategory.commands = append(commandCategory.commands, command)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
newVal := append(*c,
|
||||||
|
&commandCategory{name: category, commands: []*Command{command}})
|
||||||
|
*c = newVal
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *commandCategories) Categories() []CommandCategory {
|
||||||
|
ret := make([]CommandCategory, len(*c))
|
||||||
|
for i, cat := range *c {
|
||||||
|
ret[i] = cat
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
// CommandCategory is a category containing commands.
|
||||||
|
type CommandCategory interface {
|
||||||
|
// Name returns the category name string
|
||||||
|
Name() string
|
||||||
|
// VisibleCommands returns a slice of the Commands with Hidden=false
|
||||||
|
VisibleCommands() []*Command
|
||||||
|
}
|
||||||
|
|
||||||
|
type commandCategory struct {
|
||||||
|
name string
|
||||||
|
commands []*Command
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *commandCategory) Name() string {
|
||||||
|
return c.name
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *commandCategory) VisibleCommands() []*Command {
|
||||||
|
if c.commands == nil {
|
||||||
|
c.commands = []*Command{}
|
||||||
|
}
|
||||||
|
|
||||||
|
var ret []*Command
|
||||||
|
for _, command := range c.commands {
|
||||||
|
if !command.Hidden {
|
||||||
|
ret = append(ret, command)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
17
vendor/github.com/urfave/cli/cli.go → vendor/github.com/urfave/cli/v2/cli.go
generated
vendored
17
vendor/github.com/urfave/cli/cli.go → vendor/github.com/urfave/cli/v2/cli.go
generated
vendored
|
@ -2,18 +2,19 @@
|
||||||
// Go applications. cli is designed to be easy to understand and write, the most simple
|
// Go applications. cli is designed to be easy to understand and write, the most simple
|
||||||
// cli application can be written as follows:
|
// cli application can be written as follows:
|
||||||
// func main() {
|
// func main() {
|
||||||
// cli.NewApp().Run(os.Args)
|
// (&cli.App{}).Run(os.Args)
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// Of course this application does not do much, so let's make this an actual application:
|
// Of course this application does not do much, so let's make this an actual application:
|
||||||
// func main() {
|
// func main() {
|
||||||
// app := cli.NewApp()
|
// app := &cli.App{
|
||||||
// app.Name = "greet"
|
// Name: "greet",
|
||||||
// app.Usage = "say a greeting"
|
// Usage: "say a greeting",
|
||||||
// app.Action = func(c *cli.Context) error {
|
// Action: func(c *cli.Context) error {
|
||||||
// println("Greetings")
|
// fmt.Println("Greetings")
|
||||||
// return nil
|
// return nil
|
||||||
// }
|
// },
|
||||||
|
// }
|
||||||
//
|
//
|
||||||
// app.Run(os.Args)
|
// app.Run(os.Args)
|
||||||
// }
|
// }
|
196
vendor/github.com/urfave/cli/command.go → vendor/github.com/urfave/cli/v2/command.go
generated
vendored
196
vendor/github.com/urfave/cli/command.go → vendor/github.com/urfave/cli/v2/command.go
generated
vendored
|
@ -11,8 +11,6 @@ import (
|
||||||
type Command struct {
|
type Command struct {
|
||||||
// The name of the command
|
// The name of the command
|
||||||
Name string
|
Name string
|
||||||
// short name of the command. Typically one character (deprecated, use `Aliases`)
|
|
||||||
ShortName string
|
|
||||||
// A list of aliases for the command
|
// A list of aliases for the command
|
||||||
Aliases []string
|
Aliases []string
|
||||||
// A short description of the usage of this command
|
// A short description of the usage of this command
|
||||||
|
@ -34,23 +32,15 @@ type Command struct {
|
||||||
// It is run even if Action() panics
|
// It is run even if Action() panics
|
||||||
After AfterFunc
|
After AfterFunc
|
||||||
// The function to call when this command is invoked
|
// The function to call when this command is invoked
|
||||||
Action interface{}
|
Action ActionFunc
|
||||||
// TODO: replace `Action: interface{}` with `Action: ActionFunc` once some kind
|
|
||||||
// of deprecation period has passed, maybe?
|
|
||||||
|
|
||||||
// Execute this function if a usage error occurs.
|
// Execute this function if a usage error occurs.
|
||||||
OnUsageError OnUsageErrorFunc
|
OnUsageError OnUsageErrorFunc
|
||||||
// List of child commands
|
// List of child commands
|
||||||
Subcommands Commands
|
Subcommands []*Command
|
||||||
// List of flags to parse
|
// List of flags to parse
|
||||||
Flags []Flag
|
Flags []Flag
|
||||||
// Treat all flags as normal arguments if true
|
// Treat all flags as normal arguments if true
|
||||||
SkipFlagParsing bool
|
SkipFlagParsing bool
|
||||||
// Skip argument reordering which attempts to move flags before arguments,
|
|
||||||
// but only works if all flags appear after all arguments. This behavior was
|
|
||||||
// removed n version 2 since it only works under specific conditions so we
|
|
||||||
// backport here by exposing it as an option for compatibility.
|
|
||||||
SkipArgReorder bool
|
|
||||||
// Boolean to hide built-in help command
|
// Boolean to hide built-in help command
|
||||||
HideHelp bool
|
HideHelp bool
|
||||||
// Boolean to hide this command from help or completion
|
// Boolean to hide this command from help or completion
|
||||||
|
@ -70,7 +60,9 @@ type Command struct {
|
||||||
CustomHelpTemplate string
|
CustomHelpTemplate string
|
||||||
}
|
}
|
||||||
|
|
||||||
type CommandsByName []Command
|
type Commands []*Command
|
||||||
|
|
||||||
|
type CommandsByName []*Command
|
||||||
|
|
||||||
func (c CommandsByName) Len() int {
|
func (c CommandsByName) Len() int {
|
||||||
return len(c)
|
return len(c)
|
||||||
|
@ -86,35 +78,29 @@ func (c CommandsByName) Swap(i, j int) {
|
||||||
|
|
||||||
// FullName returns the full name of the command.
|
// FullName returns the full name of the command.
|
||||||
// For subcommands this ensures that parent commands are part of the command path
|
// For subcommands this ensures that parent commands are part of the command path
|
||||||
func (c Command) FullName() string {
|
func (c *Command) FullName() string {
|
||||||
if c.commandNamePath == nil {
|
if c.commandNamePath == nil {
|
||||||
return c.Name
|
return c.Name
|
||||||
}
|
}
|
||||||
return strings.Join(c.commandNamePath, " ")
|
return strings.Join(c.commandNamePath, " ")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Commands is a slice of Command
|
|
||||||
type Commands []Command
|
|
||||||
|
|
||||||
// Run invokes the command given the context, parses ctx.Args() to generate command-specific flags
|
// Run invokes the command given the context, parses ctx.Args() to generate command-specific flags
|
||||||
func (c Command) Run(ctx *Context) (err error) {
|
func (c *Command) Run(ctx *Context) (err error) {
|
||||||
if len(c.Subcommands) > 0 {
|
if len(c.Subcommands) > 0 {
|
||||||
return c.startApp(ctx)
|
return c.startApp(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !c.HideHelp && (HelpFlag != BoolFlag{}) {
|
if !c.HideHelp && HelpFlag != nil {
|
||||||
// append help to flags
|
// append help to flags
|
||||||
c.Flags = append(
|
c.appendFlag(HelpFlag)
|
||||||
c.Flags,
|
|
||||||
HelpFlag,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ctx.App.UseShortOptionHandling {
|
if ctx.App.UseShortOptionHandling {
|
||||||
c.UseShortOptionHandling = true
|
c.UseShortOptionHandling = true
|
||||||
}
|
}
|
||||||
|
|
||||||
set, err := c.parseFlags(ctx.Args().Tail())
|
set, err := c.parseFlags(ctx.Args(), ctx.shellComplete)
|
||||||
|
|
||||||
context := NewContext(ctx.App, set, ctx)
|
context := NewContext(ctx.App, set, ctx)
|
||||||
context.Command = c
|
context.Command = c
|
||||||
|
@ -124,7 +110,7 @@ func (c Command) Run(ctx *Context) (err error) {
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if c.OnUsageError != nil {
|
if c.OnUsageError != nil {
|
||||||
err := c.OnUsageError(context, err, false)
|
err = c.OnUsageError(context, err, false)
|
||||||
context.App.handleExitCoder(context, err)
|
context.App.handleExitCoder(context, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -150,7 +136,7 @@ func (c Command) Run(ctx *Context) (err error) {
|
||||||
if afterErr != nil {
|
if afterErr != nil {
|
||||||
context.App.handleExitCoder(context, err)
|
context.App.handleExitCoder(context, err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = NewMultiError(err, afterErr)
|
err = newMultiError(err, afterErr)
|
||||||
} else {
|
} else {
|
||||||
err = afterErr
|
err = afterErr
|
||||||
}
|
}
|
||||||
|
@ -171,7 +157,8 @@ func (c Command) Run(ctx *Context) (err error) {
|
||||||
c.Action = helpSubcommand.Action
|
c.Action = helpSubcommand.Action
|
||||||
}
|
}
|
||||||
|
|
||||||
err = HandleAction(c.Action, context)
|
context.Command = c
|
||||||
|
err = c.Action(context)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
context.App.handleExitCoder(context, err)
|
context.App.handleExitCoder(context, err)
|
||||||
|
@ -179,26 +166,25 @@ func (c Command) Run(ctx *Context) (err error) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Command) parseFlags(args Args) (*flag.FlagSet, error) {
|
func (c *Command) newFlagSet() (*flag.FlagSet, error) {
|
||||||
if c.SkipFlagParsing {
|
return flagSet(c.Name, c.Flags)
|
||||||
set, err := c.newFlagSet()
|
}
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return set, set.Parse(append([]string{"--"}, args...))
|
func (c *Command) useShortOptionHandling() bool {
|
||||||
}
|
return c.UseShortOptionHandling
|
||||||
|
}
|
||||||
if !c.SkipArgReorder {
|
|
||||||
args = reorderArgs(c.Flags, args)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
func (c *Command) parseFlags(args Args, shellComplete bool) (*flag.FlagSet, error) {
|
||||||
set, err := c.newFlagSet()
|
set, err := c.newFlagSet()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = parseIter(set, c, args)
|
if c.SkipFlagParsing {
|
||||||
|
return set, set.Parse(append([]string{"--"}, args.Tail()...))
|
||||||
|
}
|
||||||
|
|
||||||
|
err = parseIter(set, c, args.Tail(), shellComplete)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -211,96 +197,13 @@ func (c *Command) parseFlags(args Args) (*flag.FlagSet, error) {
|
||||||
return set, nil
|
return set, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Command) newFlagSet() (*flag.FlagSet, error) {
|
|
||||||
return flagSet(c.Name, c.Flags)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Command) useShortOptionHandling() bool {
|
|
||||||
return c.UseShortOptionHandling
|
|
||||||
}
|
|
||||||
|
|
||||||
// reorderArgs moves all flags (via reorderedArgs) before the rest of
|
|
||||||
// the arguments (remainingArgs) as this is what flag expects.
|
|
||||||
func reorderArgs(commandFlags []Flag, args []string) []string {
|
|
||||||
var remainingArgs, reorderedArgs []string
|
|
||||||
|
|
||||||
nextIndexMayContainValue := false
|
|
||||||
for i, arg := range args {
|
|
||||||
|
|
||||||
// dont reorder any args after a --
|
|
||||||
// read about -- here:
|
|
||||||
// https://unix.stackexchange.com/questions/11376/what-does-double-dash-mean-also-known-as-bare-double-dash
|
|
||||||
if arg == "--" {
|
|
||||||
remainingArgs = append(remainingArgs, args[i:]...)
|
|
||||||
break
|
|
||||||
|
|
||||||
// checks if this arg is a value that should be re-ordered next to its associated flag
|
|
||||||
} else if nextIndexMayContainValue && !strings.HasPrefix(arg, "-") {
|
|
||||||
nextIndexMayContainValue = false
|
|
||||||
reorderedArgs = append(reorderedArgs, arg)
|
|
||||||
|
|
||||||
// checks if this is an arg that should be re-ordered
|
|
||||||
} else if argIsFlag(commandFlags, arg) {
|
|
||||||
// we have determined that this is a flag that we should re-order
|
|
||||||
reorderedArgs = append(reorderedArgs, arg)
|
|
||||||
// if this arg does not contain a "=", then the next index may contain the value for this flag
|
|
||||||
nextIndexMayContainValue = !strings.Contains(arg, "=")
|
|
||||||
|
|
||||||
// simply append any remaining args
|
|
||||||
} else {
|
|
||||||
remainingArgs = append(remainingArgs, arg)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return append(reorderedArgs, remainingArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// argIsFlag checks if an arg is one of our command flags
|
|
||||||
func argIsFlag(commandFlags []Flag, arg string) bool {
|
|
||||||
// checks if this is just a `-`, and so definitely not a flag
|
|
||||||
if arg == "-" {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
// flags always start with a -
|
|
||||||
if !strings.HasPrefix(arg, "-") {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
// this line turns `--flag` into `flag`
|
|
||||||
if strings.HasPrefix(arg, "--") {
|
|
||||||
arg = strings.Replace(arg, "-", "", 2)
|
|
||||||
}
|
|
||||||
// this line turns `-flag` into `flag`
|
|
||||||
if strings.HasPrefix(arg, "-") {
|
|
||||||
arg = strings.Replace(arg, "-", "", 1)
|
|
||||||
}
|
|
||||||
// this line turns `flag=value` into `flag`
|
|
||||||
arg = strings.Split(arg, "=")[0]
|
|
||||||
// look through all the flags, to see if the `arg` is one of our flags
|
|
||||||
for _, flag := range commandFlags {
|
|
||||||
for _, key := range strings.Split(flag.GetName(), ",") {
|
|
||||||
key := strings.TrimSpace(key)
|
|
||||||
if key == arg {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// return false if this arg was not one of our flags
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Names returns the names including short names and aliases.
|
// Names returns the names including short names and aliases.
|
||||||
func (c Command) Names() []string {
|
func (c *Command) Names() []string {
|
||||||
names := []string{c.Name}
|
return append([]string{c.Name}, c.Aliases...)
|
||||||
|
|
||||||
if c.ShortName != "" {
|
|
||||||
names = append(names, c.ShortName)
|
|
||||||
}
|
|
||||||
|
|
||||||
return append(names, c.Aliases...)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// HasName returns true if Command.Name or Command.ShortName matches given name
|
// HasName returns true if Command.Name matches given name
|
||||||
func (c Command) HasName(name string) bool {
|
func (c *Command) HasName(name string) bool {
|
||||||
for _, n := range c.Names() {
|
for _, n := range c.Names() {
|
||||||
if n == name {
|
if n == name {
|
||||||
return true
|
return true
|
||||||
|
@ -309,12 +212,12 @@ func (c Command) HasName(name string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c Command) startApp(ctx *Context) error {
|
func (c *Command) startApp(ctx *Context) error {
|
||||||
app := NewApp()
|
app := &App{
|
||||||
app.Metadata = ctx.App.Metadata
|
Metadata: ctx.App.Metadata,
|
||||||
app.ExitErrHandler = ctx.App.ExitErrHandler
|
Name: fmt.Sprintf("%s %s", ctx.App.Name, c.Name),
|
||||||
// set the name and usage
|
}
|
||||||
app.Name = fmt.Sprintf("%s %s", ctx.App.Name, c.Name)
|
|
||||||
if c.HelpName == "" {
|
if c.HelpName == "" {
|
||||||
app.HelpName = c.HelpName
|
app.HelpName = c.HelpName
|
||||||
} else {
|
} else {
|
||||||
|
@ -337,18 +240,17 @@ func (c Command) startApp(ctx *Context) error {
|
||||||
app.Version = ctx.App.Version
|
app.Version = ctx.App.Version
|
||||||
app.HideVersion = ctx.App.HideVersion
|
app.HideVersion = ctx.App.HideVersion
|
||||||
app.Compiled = ctx.App.Compiled
|
app.Compiled = ctx.App.Compiled
|
||||||
app.Author = ctx.App.Author
|
|
||||||
app.Email = ctx.App.Email
|
|
||||||
app.Writer = ctx.App.Writer
|
app.Writer = ctx.App.Writer
|
||||||
app.ErrWriter = ctx.App.ErrWriter
|
app.ErrWriter = ctx.App.ErrWriter
|
||||||
|
app.ExitErrHandler = ctx.App.ExitErrHandler
|
||||||
app.UseShortOptionHandling = ctx.App.UseShortOptionHandling
|
app.UseShortOptionHandling = ctx.App.UseShortOptionHandling
|
||||||
|
|
||||||
app.categories = CommandCategories{}
|
app.categories = newCommandCategories()
|
||||||
for _, command := range c.Subcommands {
|
for _, command := range c.Subcommands {
|
||||||
app.categories = app.categories.AddCommand(command.Category, command)
|
app.categories.AddCommand(command.Category, command)
|
||||||
}
|
}
|
||||||
|
|
||||||
sort.Sort(app.categories)
|
sort.Sort(app.categories.(*commandCategories))
|
||||||
|
|
||||||
// bash completion
|
// bash completion
|
||||||
app.EnableBashCompletion = ctx.App.EnableBashCompletion
|
app.EnableBashCompletion = ctx.App.EnableBashCompletion
|
||||||
|
@ -374,6 +276,22 @@ func (c Command) startApp(ctx *Context) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// VisibleFlags returns a slice of the Flags with Hidden=false
|
// VisibleFlags returns a slice of the Flags with Hidden=false
|
||||||
func (c Command) VisibleFlags() []Flag {
|
func (c *Command) VisibleFlags() []Flag {
|
||||||
return visibleFlags(c.Flags)
|
return visibleFlags(c.Flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Command) appendFlag(fl Flag) {
|
||||||
|
if !hasFlag(c.Flags, fl) {
|
||||||
|
c.Flags = append(c.Flags, fl)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func hasCommand(commands []*Command, command *Command) bool {
|
||||||
|
for _, existing := range commands {
|
||||||
|
if command == existing {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
274
vendor/github.com/urfave/cli/v2/context.go
generated
vendored
Normal file
274
vendor/github.com/urfave/cli/v2/context.go
generated
vendored
Normal file
|
@ -0,0 +1,274 @@
|
||||||
|
package cli
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Context is a type that is passed through to
|
||||||
|
// each Handler action in a cli application. Context
|
||||||
|
// can be used to retrieve context-specific args and
|
||||||
|
// parsed command-line options.
|
||||||
|
type Context struct {
|
||||||
|
context.Context
|
||||||
|
App *App
|
||||||
|
Command *Command
|
||||||
|
shellComplete bool
|
||||||
|
setFlags map[string]bool
|
||||||
|
flagSet *flag.FlagSet
|
||||||
|
parentContext *Context
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewContext creates a new context. For use in when invoking an App or Command action.
|
||||||
|
func NewContext(app *App, set *flag.FlagSet, parentCtx *Context) *Context {
|
||||||
|
c := &Context{App: app, flagSet: set, parentContext: parentCtx}
|
||||||
|
if parentCtx != nil {
|
||||||
|
c.Context = parentCtx.Context
|
||||||
|
c.shellComplete = parentCtx.shellComplete
|
||||||
|
if parentCtx.flagSet == nil {
|
||||||
|
parentCtx.flagSet = &flag.FlagSet{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Command = &Command{}
|
||||||
|
|
||||||
|
if c.Context == nil {
|
||||||
|
c.Context = context.Background()
|
||||||
|
}
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// NumFlags returns the number of flags set
|
||||||
|
func (c *Context) NumFlags() int {
|
||||||
|
return c.flagSet.NFlag()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set sets a context flag to a value.
|
||||||
|
func (c *Context) Set(name, value string) error {
|
||||||
|
return c.flagSet.Set(name, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSet determines if the flag was actually set
|
||||||
|
func (c *Context) IsSet(name string) bool {
|
||||||
|
if fs := lookupFlagSet(name, c); fs != nil {
|
||||||
|
if fs := lookupFlagSet(name, c); fs != nil {
|
||||||
|
isSet := false
|
||||||
|
fs.Visit(func(f *flag.Flag) {
|
||||||
|
if f.Name == name {
|
||||||
|
isSet = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if isSet {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
f := lookupFlag(name, c)
|
||||||
|
if f == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return f.IsSet()
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// LocalFlagNames returns a slice of flag names used in this context.
|
||||||
|
func (c *Context) LocalFlagNames() []string {
|
||||||
|
var names []string
|
||||||
|
c.flagSet.Visit(makeFlagNameVisitor(&names))
|
||||||
|
return names
|
||||||
|
}
|
||||||
|
|
||||||
|
// FlagNames returns a slice of flag names used by the this context and all of
|
||||||
|
// its parent contexts.
|
||||||
|
func (c *Context) FlagNames() []string {
|
||||||
|
var names []string
|
||||||
|
for _, ctx := range c.Lineage() {
|
||||||
|
ctx.flagSet.Visit(makeFlagNameVisitor(&names))
|
||||||
|
}
|
||||||
|
return names
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lineage returns *this* context and all of its ancestor contexts in order from
|
||||||
|
// child to parent
|
||||||
|
func (c *Context) Lineage() []*Context {
|
||||||
|
var lineage []*Context
|
||||||
|
|
||||||
|
for cur := c; cur != nil; cur = cur.parentContext {
|
||||||
|
lineage = append(lineage, cur)
|
||||||
|
}
|
||||||
|
|
||||||
|
return lineage
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the value of the flag corresponding to `name`
|
||||||
|
func (c *Context) Value(name string) interface{} {
|
||||||
|
return c.flagSet.Lookup(name).Value.(flag.Getter).Get()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Args returns the command line arguments associated with the context.
|
||||||
|
func (c *Context) Args() Args {
|
||||||
|
ret := args(c.flagSet.Args())
|
||||||
|
return &ret
|
||||||
|
}
|
||||||
|
|
||||||
|
// NArg returns the number of the command line arguments.
|
||||||
|
func (c *Context) NArg() int {
|
||||||
|
return c.Args().Len()
|
||||||
|
}
|
||||||
|
|
||||||
|
func lookupFlag(name string, ctx *Context) Flag {
|
||||||
|
for _, c := range ctx.Lineage() {
|
||||||
|
if c.Command == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, f := range c.Command.Flags {
|
||||||
|
for _, n := range f.Names() {
|
||||||
|
if n == name {
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ctx.App != nil {
|
||||||
|
for _, f := range ctx.App.Flags {
|
||||||
|
for _, n := range f.Names() {
|
||||||
|
if n == name {
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func lookupFlagSet(name string, ctx *Context) *flag.FlagSet {
|
||||||
|
for _, c := range ctx.Lineage() {
|
||||||
|
if f := c.flagSet.Lookup(name); f != nil {
|
||||||
|
return c.flagSet
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) {
|
||||||
|
switch ff.Value.(type) {
|
||||||
|
case Serializer:
|
||||||
|
_ = set.Set(name, ff.Value.(Serializer).Serialize())
|
||||||
|
default:
|
||||||
|
_ = set.Set(name, ff.Value.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func normalizeFlags(flags []Flag, set *flag.FlagSet) error {
|
||||||
|
visited := make(map[string]bool)
|
||||||
|
set.Visit(func(f *flag.Flag) {
|
||||||
|
visited[f.Name] = true
|
||||||
|
})
|
||||||
|
for _, f := range flags {
|
||||||
|
parts := f.Names()
|
||||||
|
if len(parts) == 1 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var ff *flag.Flag
|
||||||
|
for _, name := range parts {
|
||||||
|
name = strings.Trim(name, " ")
|
||||||
|
if visited[name] {
|
||||||
|
if ff != nil {
|
||||||
|
return errors.New("Cannot use two forms of the same flag: " + name + " " + ff.Name)
|
||||||
|
}
|
||||||
|
ff = set.Lookup(name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ff == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for _, name := range parts {
|
||||||
|
name = strings.Trim(name, " ")
|
||||||
|
if !visited[name] {
|
||||||
|
copyFlag(name, ff, set)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeFlagNameVisitor(names *[]string) func(*flag.Flag) {
|
||||||
|
return func(f *flag.Flag) {
|
||||||
|
nameParts := strings.Split(f.Name, ",")
|
||||||
|
name := strings.TrimSpace(nameParts[0])
|
||||||
|
|
||||||
|
for _, part := range nameParts {
|
||||||
|
part = strings.TrimSpace(part)
|
||||||
|
if len(part) > len(name) {
|
||||||
|
name = part
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if name != "" {
|
||||||
|
*names = append(*names, name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type requiredFlagsErr interface {
|
||||||
|
error
|
||||||
|
getMissingFlags() []string
|
||||||
|
}
|
||||||
|
|
||||||
|
type errRequiredFlags struct {
|
||||||
|
missingFlags []string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *errRequiredFlags) Error() string {
|
||||||
|
numberOfMissingFlags := len(e.missingFlags)
|
||||||
|
if numberOfMissingFlags == 1 {
|
||||||
|
return fmt.Sprintf("Required flag %q not set", e.missingFlags[0])
|
||||||
|
}
|
||||||
|
joinedMissingFlags := strings.Join(e.missingFlags, ", ")
|
||||||
|
return fmt.Sprintf("Required flags %q not set", joinedMissingFlags)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *errRequiredFlags) getMissingFlags() []string {
|
||||||
|
return e.missingFlags
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkRequiredFlags(flags []Flag, context *Context) requiredFlagsErr {
|
||||||
|
var missingFlags []string
|
||||||
|
for _, f := range flags {
|
||||||
|
if rf, ok := f.(RequiredFlag); ok && rf.IsRequired() {
|
||||||
|
var flagPresent bool
|
||||||
|
var flagName string
|
||||||
|
|
||||||
|
for _, key := range f.Names() {
|
||||||
|
if len(key) > 1 {
|
||||||
|
flagName = key
|
||||||
|
}
|
||||||
|
|
||||||
|
if context.IsSet(strings.TrimSpace(key)) {
|
||||||
|
flagPresent = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !flagPresent && flagName != "" {
|
||||||
|
missingFlags = append(missingFlags, flagName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(missingFlags) != 0 {
|
||||||
|
return &errRequiredFlags{missingFlags: missingFlags}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
14
vendor/github.com/urfave/cli/docs.go → vendor/github.com/urfave/cli/v2/docs.go
generated
vendored
14
vendor/github.com/urfave/cli/docs.go → vendor/github.com/urfave/cli/v2/docs.go
generated
vendored
|
@ -48,15 +48,14 @@ func (a *App) writeDocTemplate(w io.Writer) error {
|
||||||
return t.ExecuteTemplate(w, name, &cliTemplate{
|
return t.ExecuteTemplate(w, name, &cliTemplate{
|
||||||
App: a,
|
App: a,
|
||||||
Commands: prepareCommands(a.Commands, 0),
|
Commands: prepareCommands(a.Commands, 0),
|
||||||
GlobalArgs: prepareArgsWithValues(a.Flags),
|
GlobalArgs: prepareArgsWithValues(a.VisibleFlags()),
|
||||||
SynopsisArgs: prepareArgsSynopsis(a.Flags),
|
SynopsisArgs: prepareArgsSynopsis(a.VisibleFlags()),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func prepareCommands(commands []Command, level int) []string {
|
func prepareCommands(commands []*Command, level int) []string {
|
||||||
coms := []string{}
|
var coms []string
|
||||||
for i := range commands {
|
for _, command := range commands {
|
||||||
command := &commands[i]
|
|
||||||
if command.Hidden {
|
if command.Hidden {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -110,7 +109,8 @@ func prepareFlags(
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
modifiedArg := opener
|
modifiedArg := opener
|
||||||
for _, s := range strings.Split(flag.GetName(), ",") {
|
|
||||||
|
for _, s := range flag.Names() {
|
||||||
trimmed := strings.TrimSpace(s)
|
trimmed := strings.TrimSpace(s)
|
||||||
if len(modifiedArg) > len(opener) {
|
if len(modifiedArg) > len(opener) {
|
||||||
modifiedArg += sep
|
modifiedArg += sep
|
62
vendor/github.com/urfave/cli/errors.go → vendor/github.com/urfave/cli/v2/errors.go
generated
vendored
62
vendor/github.com/urfave/cli/errors.go → vendor/github.com/urfave/cli/v2/errors.go
generated
vendored
|
@ -15,25 +15,40 @@ var OsExiter = os.Exit
|
||||||
var ErrWriter io.Writer = os.Stderr
|
var ErrWriter io.Writer = os.Stderr
|
||||||
|
|
||||||
// MultiError is an error that wraps multiple errors.
|
// MultiError is an error that wraps multiple errors.
|
||||||
type MultiError struct {
|
type MultiError interface {
|
||||||
Errors []error
|
error
|
||||||
|
// Errors returns a copy of the errors slice
|
||||||
|
Errors() []error
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMultiError creates a new MultiError. Pass in one or more errors.
|
// NewMultiError creates a new MultiError. Pass in one or more errors.
|
||||||
func NewMultiError(err ...error) MultiError {
|
func newMultiError(err ...error) MultiError {
|
||||||
return MultiError{Errors: err}
|
ret := multiError(err)
|
||||||
|
return &ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type multiError []error
|
||||||
|
|
||||||
// Error implements the error interface.
|
// Error implements the error interface.
|
||||||
func (m MultiError) Error() string {
|
func (m *multiError) Error() string {
|
||||||
errs := make([]string, len(m.Errors))
|
errs := make([]string, len(*m))
|
||||||
for i, err := range m.Errors {
|
for i, err := range *m {
|
||||||
errs[i] = err.Error()
|
errs[i] = err.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(errs, "\n")
|
return strings.Join(errs, "\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Errors returns a copy of the errors slice
|
||||||
|
func (m *multiError) Errors() []error {
|
||||||
|
errs := make([]error, len(*m))
|
||||||
|
for _, err := range *m {
|
||||||
|
errs = append(errs, err)
|
||||||
|
}
|
||||||
|
return errs
|
||||||
|
}
|
||||||
|
|
||||||
|
// ErrorFormatter is the interface that will suitably format the error output
|
||||||
type ErrorFormatter interface {
|
type ErrorFormatter interface {
|
||||||
Format(s fmt.State, verb rune)
|
Format(s fmt.State, verb rune)
|
||||||
}
|
}
|
||||||
|
@ -45,29 +60,30 @@ type ExitCoder interface {
|
||||||
ExitCode() int
|
ExitCode() int
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExitError fulfills both the builtin `error` interface and `ExitCoder`
|
type exitError struct {
|
||||||
type ExitError struct {
|
|
||||||
exitCode int
|
exitCode int
|
||||||
message interface{}
|
message interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewExitError makes a new *ExitError
|
// NewExitError makes a new *exitError
|
||||||
func NewExitError(message interface{}, exitCode int) *ExitError {
|
func NewExitError(message interface{}, exitCode int) ExitCoder {
|
||||||
return &ExitError{
|
return Exit(message, exitCode)
|
||||||
exitCode: exitCode,
|
}
|
||||||
|
|
||||||
|
// Exit wraps a message and exit code into an ExitCoder suitable for handling by
|
||||||
|
// HandleExitCoder
|
||||||
|
func Exit(message interface{}, exitCode int) ExitCoder {
|
||||||
|
return &exitError{
|
||||||
message: message,
|
message: message,
|
||||||
|
exitCode: exitCode,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error returns the string message, fulfilling the interface required by
|
func (ee *exitError) Error() string {
|
||||||
// `error`
|
|
||||||
func (ee *ExitError) Error() string {
|
|
||||||
return fmt.Sprintf("%v", ee.message)
|
return fmt.Sprintf("%v", ee.message)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExitCode returns the exit code, fulfilling the interface required by
|
func (ee *exitError) ExitCode() int {
|
||||||
// `ExitCoder`
|
|
||||||
func (ee *ExitError) ExitCode() int {
|
|
||||||
return ee.exitCode
|
return ee.exitCode
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,9 +99,9 @@ func HandleExitCoder(err error) {
|
||||||
if exitErr, ok := err.(ExitCoder); ok {
|
if exitErr, ok := err.(ExitCoder); ok {
|
||||||
if err.Error() != "" {
|
if err.Error() != "" {
|
||||||
if _, ok := exitErr.(ErrorFormatter); ok {
|
if _, ok := exitErr.(ErrorFormatter); ok {
|
||||||
fmt.Fprintf(ErrWriter, "%+v\n", err)
|
_, _ = fmt.Fprintf(ErrWriter, "%+v\n", err)
|
||||||
} else {
|
} else {
|
||||||
fmt.Fprintln(ErrWriter, err)
|
_, _ = fmt.Fprintln(ErrWriter, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
OsExiter(exitErr.ExitCode())
|
OsExiter(exitErr.ExitCode())
|
||||||
|
@ -101,10 +117,10 @@ func HandleExitCoder(err error) {
|
||||||
|
|
||||||
func handleMultiError(multiErr MultiError) int {
|
func handleMultiError(multiErr MultiError) int {
|
||||||
code := 1
|
code := 1
|
||||||
for _, merr := range multiErr.Errors {
|
for _, merr := range multiErr.Errors() {
|
||||||
if multiErr2, ok := merr.(MultiError); ok {
|
if multiErr2, ok := merr.(MultiError); ok {
|
||||||
code = handleMultiError(multiErr2)
|
code = handleMultiError(multiErr2)
|
||||||
} else {
|
} else if merr != nil {
|
||||||
fmt.Fprintln(ErrWriter, merr)
|
fmt.Fprintln(ErrWriter, merr)
|
||||||
if exitErr, ok := merr.(ExitCoder); ok {
|
if exitErr, ok := merr.(ExitCoder); ok {
|
||||||
code = exitErr.ExitCode()
|
code = exitErr.ExitCode()
|
14
vendor/github.com/urfave/cli/fish.go → vendor/github.com/urfave/cli/v2/fish.go
generated
vendored
14
vendor/github.com/urfave/cli/fish.go → vendor/github.com/urfave/cli/v2/fish.go
generated
vendored
|
@ -64,11 +64,9 @@ func (a *App) writeFishCompletionTemplate(w io.Writer) error {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) prepareFishCommands(commands []Command, allCommands *[]string, previousCommands []string) []string {
|
func (a *App) prepareFishCommands(commands []*Command, allCommands *[]string, previousCommands []string) []string {
|
||||||
completions := []string{}
|
completions := []string{}
|
||||||
for i := range commands {
|
for _, command := range commands {
|
||||||
command := &commands[i]
|
|
||||||
|
|
||||||
if command.Hidden {
|
if command.Hidden {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -131,7 +129,7 @@ func (a *App) prepareFishFlags(flags []Flag, previousCommands []string) []string
|
||||||
|
|
||||||
fishAddFileFlag(f, completion)
|
fishAddFileFlag(f, completion)
|
||||||
|
|
||||||
for idx, opt := range strings.Split(flag.GetName(), ",") {
|
for idx, opt := range flag.Names() {
|
||||||
if idx == 0 {
|
if idx == 0 {
|
||||||
completion.WriteString(fmt.Sprintf(
|
completion.WriteString(fmt.Sprintf(
|
||||||
" -l %s", strings.TrimSpace(opt),
|
" -l %s", strings.TrimSpace(opt),
|
||||||
|
@ -161,15 +159,15 @@ func (a *App) prepareFishFlags(flags []Flag, previousCommands []string) []string
|
||||||
|
|
||||||
func fishAddFileFlag(flag Flag, completion *strings.Builder) {
|
func fishAddFileFlag(flag Flag, completion *strings.Builder) {
|
||||||
switch f := flag.(type) {
|
switch f := flag.(type) {
|
||||||
case GenericFlag:
|
case *GenericFlag:
|
||||||
if f.TakesFile {
|
if f.TakesFile {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
case StringFlag:
|
case *StringFlag:
|
||||||
if f.TakesFile {
|
if f.TakesFile {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
case StringSliceFlag:
|
case *StringSliceFlag:
|
||||||
if f.TakesFile {
|
if f.TakesFile {
|
||||||
return
|
return
|
||||||
}
|
}
|
236
vendor/github.com/urfave/cli/flag.go → vendor/github.com/urfave/cli/v2/flag.go
generated
vendored
236
vendor/github.com/urfave/cli/flag.go → vendor/github.com/urfave/cli/v2/flag.go
generated
vendored
|
@ -5,38 +5,53 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
const defaultPlaceholder = "value"
|
const defaultPlaceholder = "value"
|
||||||
|
|
||||||
|
var (
|
||||||
|
slPfx = fmt.Sprintf("sl:::%d:::", time.Now().UTC().UnixNano())
|
||||||
|
|
||||||
|
commaWhitespace = regexp.MustCompile("[, ]+.*")
|
||||||
|
)
|
||||||
|
|
||||||
// BashCompletionFlag enables bash-completion for all commands and subcommands
|
// BashCompletionFlag enables bash-completion for all commands and subcommands
|
||||||
var BashCompletionFlag Flag = BoolFlag{
|
var BashCompletionFlag Flag = &BoolFlag{
|
||||||
Name: "generate-bash-completion",
|
Name: "generate-bash-completion",
|
||||||
Hidden: true,
|
Hidden: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
// VersionFlag prints the version for the application
|
// VersionFlag prints the version for the application
|
||||||
var VersionFlag Flag = BoolFlag{
|
var VersionFlag Flag = &BoolFlag{
|
||||||
Name: "version, v",
|
Name: "version",
|
||||||
Usage: "print the version",
|
Aliases: []string{"v"},
|
||||||
|
Usage: "print the version",
|
||||||
}
|
}
|
||||||
|
|
||||||
// HelpFlag prints the help for all commands and subcommands
|
// HelpFlag prints the help for all commands and subcommands.
|
||||||
// Set to the zero value (BoolFlag{}) to disable flag -- keeps subcommand
|
// Set to nil to disable the flag. The subcommand
|
||||||
// unless HideHelp is set to true)
|
// will still be added unless HideHelp is set to true.
|
||||||
var HelpFlag Flag = BoolFlag{
|
var HelpFlag Flag = &BoolFlag{
|
||||||
Name: "help, h",
|
Name: "help",
|
||||||
Usage: "show help",
|
Aliases: []string{"h"},
|
||||||
|
Usage: "show help",
|
||||||
}
|
}
|
||||||
|
|
||||||
// FlagStringer converts a flag definition to a string. This is used by help
|
// FlagStringer converts a flag definition to a string. This is used by help
|
||||||
// to display a flag.
|
// to display a flag.
|
||||||
var FlagStringer FlagStringFunc = stringifyFlag
|
var FlagStringer FlagStringFunc = stringifyFlag
|
||||||
|
|
||||||
|
// Serializer is used to circumvent the limitations of flag.FlagSet.Set
|
||||||
|
type Serializer interface {
|
||||||
|
Serialize() string
|
||||||
|
}
|
||||||
|
|
||||||
// FlagNamePrefixer converts a full flag name and its placeholder into the help
|
// FlagNamePrefixer converts a full flag name and its placeholder into the help
|
||||||
// message flag prefix. This is used by the default FlagStringer.
|
// message flag prefix. This is used by the default FlagStringer.
|
||||||
var FlagNamePrefixer FlagNamePrefixFunc = prefixedNames
|
var FlagNamePrefixer FlagNamePrefixFunc = prefixedNames
|
||||||
|
@ -57,7 +72,12 @@ func (f FlagsByName) Len() int {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f FlagsByName) Less(i, j int) bool {
|
func (f FlagsByName) Less(i, j int) bool {
|
||||||
return lexicographicLess(f[i].GetName(), f[j].GetName())
|
if len(f[j].Names()) == 0 {
|
||||||
|
return false
|
||||||
|
} else if len(f[i].Names()) == 0 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return lexicographicLess(f[i].Names()[0], f[j].Names()[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f FlagsByName) Swap(i, j int) {
|
func (f FlagsByName) Swap(i, j int) {
|
||||||
|
@ -70,8 +90,9 @@ func (f FlagsByName) Swap(i, j int) {
|
||||||
type Flag interface {
|
type Flag interface {
|
||||||
fmt.Stringer
|
fmt.Stringer
|
||||||
// Apply Flag settings to the given flag set
|
// Apply Flag settings to the given flag set
|
||||||
Apply(*flag.FlagSet)
|
Apply(*flag.FlagSet) error
|
||||||
GetName() string
|
Names() []string
|
||||||
|
IsSet() bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// RequiredFlag is an interface that allows us to mark flags as required
|
// RequiredFlag is an interface that allows us to mark flags as required
|
||||||
|
@ -97,40 +118,18 @@ type DocGenerationFlag interface {
|
||||||
GetValue() string
|
GetValue() string
|
||||||
}
|
}
|
||||||
|
|
||||||
// errorableFlag is an interface that allows us to return errors during apply
|
|
||||||
// it allows flags defined in this library to return errors in a fashion backwards compatible
|
|
||||||
// TODO remove in v2 and modify the existing Flag interface to return errors
|
|
||||||
type errorableFlag interface {
|
|
||||||
Flag
|
|
||||||
|
|
||||||
ApplyWithError(*flag.FlagSet) error
|
|
||||||
}
|
|
||||||
|
|
||||||
func flagSet(name string, flags []Flag) (*flag.FlagSet, error) {
|
func flagSet(name string, flags []Flag) (*flag.FlagSet, error) {
|
||||||
set := flag.NewFlagSet(name, flag.ContinueOnError)
|
set := flag.NewFlagSet(name, flag.ContinueOnError)
|
||||||
|
|
||||||
for _, f := range flags {
|
for _, f := range flags {
|
||||||
//TODO remove in v2 when errorableFlag is removed
|
if err := f.Apply(set); err != nil {
|
||||||
if ef, ok := f.(errorableFlag); ok {
|
return nil, err
|
||||||
if err := ef.ApplyWithError(set); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
f.Apply(set)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
set.SetOutput(ioutil.Discard)
|
set.SetOutput(ioutil.Discard)
|
||||||
return set, nil
|
return set, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func eachName(longName string, fn func(string)) {
|
|
||||||
parts := strings.Split(longName, ",")
|
|
||||||
for _, name := range parts {
|
|
||||||
name = strings.Trim(name, " ")
|
|
||||||
fn(name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func visibleFlags(fl []Flag) []Flag {
|
func visibleFlags(fl []Flag) []Flag {
|
||||||
var visible []Flag
|
var visible []Flag
|
||||||
for _, f := range fl {
|
for _, f := range fl {
|
||||||
|
@ -169,25 +168,27 @@ func unquoteUsage(usage string) (string, string) {
|
||||||
return "", usage
|
return "", usage
|
||||||
}
|
}
|
||||||
|
|
||||||
func prefixedNames(fullName, placeholder string) string {
|
func prefixedNames(names []string, placeholder string) string {
|
||||||
var prefixed string
|
var prefixed string
|
||||||
parts := strings.Split(fullName, ",")
|
for i, name := range names {
|
||||||
for i, name := range parts {
|
if name == "" {
|
||||||
name = strings.Trim(name, " ")
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
prefixed += prefixFor(name) + name
|
prefixed += prefixFor(name) + name
|
||||||
if placeholder != "" {
|
if placeholder != "" {
|
||||||
prefixed += " " + placeholder
|
prefixed += " " + placeholder
|
||||||
}
|
}
|
||||||
if i < len(parts)-1 {
|
if i < len(names)-1 {
|
||||||
prefixed += ", "
|
prefixed += ", "
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return prefixed
|
return prefixed
|
||||||
}
|
}
|
||||||
|
|
||||||
func withEnvHint(envVar, str string) string {
|
func withEnvHint(envVars []string, str string) string {
|
||||||
envText := ""
|
envText := ""
|
||||||
if envVar != "" {
|
if envVars != nil && len(envVars) > 0 {
|
||||||
prefix := "$"
|
prefix := "$"
|
||||||
suffix := ""
|
suffix := ""
|
||||||
sep := ", $"
|
sep := ", $"
|
||||||
|
@ -196,11 +197,51 @@ func withEnvHint(envVar, str string) string {
|
||||||
suffix = "%"
|
suffix = "%"
|
||||||
sep = "%, %"
|
sep = "%, %"
|
||||||
}
|
}
|
||||||
envText = " [" + prefix + strings.Join(strings.Split(envVar, ","), sep) + suffix + "]"
|
|
||||||
|
envText = fmt.Sprintf(" [%s%s%s]", prefix, strings.Join(envVars, sep), suffix)
|
||||||
}
|
}
|
||||||
return str + envText
|
return str + envText
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func flagNames(f Flag) []string {
|
||||||
|
var ret []string
|
||||||
|
|
||||||
|
name := flagStringField(f, "Name")
|
||||||
|
aliases := flagStringSliceField(f, "Aliases")
|
||||||
|
|
||||||
|
for _, part := range append([]string{name}, aliases...) {
|
||||||
|
// v1 -> v2 migration warning zone:
|
||||||
|
// Strip off anything after the first found comma or space, which
|
||||||
|
// *hopefully* makes it a tiny bit more obvious that unexpected behavior is
|
||||||
|
// caused by using the v1 form of stringly typed "Name".
|
||||||
|
ret = append(ret, commaWhitespace.ReplaceAllString(part, ""))
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func flagStringSliceField(f Flag, name string) []string {
|
||||||
|
fv := flagValue(f)
|
||||||
|
field := fv.FieldByName(name)
|
||||||
|
|
||||||
|
if field.IsValid() {
|
||||||
|
return field.Interface().([]string)
|
||||||
|
}
|
||||||
|
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func flagStringField(f Flag, name string) string {
|
||||||
|
fv := flagValue(f)
|
||||||
|
field := fv.FieldByName(name)
|
||||||
|
|
||||||
|
if field.IsValid() {
|
||||||
|
return field.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
func withFileHint(filePath, str string) string {
|
func withFileHint(filePath, str string) string {
|
||||||
fileText := ""
|
fileText := ""
|
||||||
if filePath != "" {
|
if filePath != "" {
|
||||||
|
@ -221,39 +262,27 @@ func stringifyFlag(f Flag) string {
|
||||||
fv := flagValue(f)
|
fv := flagValue(f)
|
||||||
|
|
||||||
switch f.(type) {
|
switch f.(type) {
|
||||||
case IntSliceFlag:
|
case *IntSliceFlag:
|
||||||
return FlagFileHinter(
|
return withEnvHint(flagStringSliceField(f, "EnvVars"),
|
||||||
fv.FieldByName("FilePath").String(),
|
stringifyIntSliceFlag(f.(*IntSliceFlag)))
|
||||||
FlagEnvHinter(
|
case *Int64SliceFlag:
|
||||||
fv.FieldByName("EnvVar").String(),
|
return withEnvHint(flagStringSliceField(f, "EnvVars"),
|
||||||
stringifyIntSliceFlag(f.(IntSliceFlag)),
|
stringifyInt64SliceFlag(f.(*Int64SliceFlag)))
|
||||||
),
|
case *Float64SliceFlag:
|
||||||
)
|
return withEnvHint(flagStringSliceField(f, "EnvVars"),
|
||||||
case Int64SliceFlag:
|
stringifyFloat64SliceFlag(f.(*Float64SliceFlag)))
|
||||||
return FlagFileHinter(
|
case *StringSliceFlag:
|
||||||
fv.FieldByName("FilePath").String(),
|
return withEnvHint(flagStringSliceField(f, "EnvVars"),
|
||||||
FlagEnvHinter(
|
stringifyStringSliceFlag(f.(*StringSliceFlag)))
|
||||||
fv.FieldByName("EnvVar").String(),
|
|
||||||
stringifyInt64SliceFlag(f.(Int64SliceFlag)),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
case StringSliceFlag:
|
|
||||||
return FlagFileHinter(
|
|
||||||
fv.FieldByName("FilePath").String(),
|
|
||||||
FlagEnvHinter(
|
|
||||||
fv.FieldByName("EnvVar").String(),
|
|
||||||
stringifyStringSliceFlag(f.(StringSliceFlag)),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
placeholder, usage := unquoteUsage(fv.FieldByName("Usage").String())
|
placeholder, usage := unquoteUsage(fv.FieldByName("Usage").String())
|
||||||
|
|
||||||
needsPlaceholder := false
|
needsPlaceholder := false
|
||||||
defaultValueString := ""
|
defaultValueString := ""
|
||||||
|
val := fv.FieldByName("Value")
|
||||||
if val := fv.FieldByName("Value"); val.IsValid() {
|
if val.IsValid() {
|
||||||
needsPlaceholder = true
|
needsPlaceholder = val.Kind() != reflect.Bool
|
||||||
defaultValueString = fmt.Sprintf(" (default: %v)", val.Interface())
|
defaultValueString = fmt.Sprintf(" (default: %v)", val.Interface())
|
||||||
|
|
||||||
if val.Kind() == reflect.String && val.String() != "" {
|
if val.Kind() == reflect.String && val.String() != "" {
|
||||||
|
@ -261,6 +290,12 @@ func stringifyFlag(f Flag) string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
helpText := fv.FieldByName("DefaultText")
|
||||||
|
if helpText.IsValid() && helpText.String() != "" {
|
||||||
|
needsPlaceholder = val.Kind() != reflect.Bool
|
||||||
|
defaultValueString = fmt.Sprintf(" (default: %s)", helpText.String())
|
||||||
|
}
|
||||||
|
|
||||||
if defaultValueString == " (default: )" {
|
if defaultValueString == " (default: )" {
|
||||||
defaultValueString = ""
|
defaultValueString = ""
|
||||||
}
|
}
|
||||||
|
@ -271,16 +306,11 @@ func stringifyFlag(f Flag) string {
|
||||||
|
|
||||||
usageWithDefault := strings.TrimSpace(usage + defaultValueString)
|
usageWithDefault := strings.TrimSpace(usage + defaultValueString)
|
||||||
|
|
||||||
return FlagFileHinter(
|
return withEnvHint(flagStringSliceField(f, "EnvVars"),
|
||||||
fv.FieldByName("FilePath").String(),
|
fmt.Sprintf("%s\t%s", prefixedNames(f.Names(), placeholder), usageWithDefault))
|
||||||
FlagEnvHinter(
|
|
||||||
fv.FieldByName("EnvVar").String(),
|
|
||||||
FlagNamePrefixer(fv.FieldByName("Name").String(), placeholder)+"\t"+usageWithDefault,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func stringifyIntSliceFlag(f IntSliceFlag) string {
|
func stringifyIntSliceFlag(f *IntSliceFlag) string {
|
||||||
var defaultVals []string
|
var defaultVals []string
|
||||||
if f.Value != nil && len(f.Value.Value()) > 0 {
|
if f.Value != nil && len(f.Value.Value()) > 0 {
|
||||||
for _, i := range f.Value.Value() {
|
for _, i := range f.Value.Value() {
|
||||||
|
@ -288,10 +318,10 @@ func stringifyIntSliceFlag(f IntSliceFlag) string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return stringifySliceFlag(f.Usage, f.Name, defaultVals)
|
return stringifySliceFlag(f.Usage, f.Names(), defaultVals)
|
||||||
}
|
}
|
||||||
|
|
||||||
func stringifyInt64SliceFlag(f Int64SliceFlag) string {
|
func stringifyInt64SliceFlag(f *Int64SliceFlag) string {
|
||||||
var defaultVals []string
|
var defaultVals []string
|
||||||
if f.Value != nil && len(f.Value.Value()) > 0 {
|
if f.Value != nil && len(f.Value.Value()) > 0 {
|
||||||
for _, i := range f.Value.Value() {
|
for _, i := range f.Value.Value() {
|
||||||
|
@ -299,10 +329,22 @@ func stringifyInt64SliceFlag(f Int64SliceFlag) string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return stringifySliceFlag(f.Usage, f.Name, defaultVals)
|
return stringifySliceFlag(f.Usage, f.Names(), defaultVals)
|
||||||
}
|
}
|
||||||
|
|
||||||
func stringifyStringSliceFlag(f StringSliceFlag) string {
|
func stringifyFloat64SliceFlag(f *Float64SliceFlag) string {
|
||||||
|
var defaultVals []string
|
||||||
|
|
||||||
|
if f.Value != nil && len(f.Value.Value()) > 0 {
|
||||||
|
for _, i := range f.Value.Value() {
|
||||||
|
defaultVals = append(defaultVals, strings.TrimRight(strings.TrimRight(fmt.Sprintf("%f", i), "0"), "."))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return stringifySliceFlag(f.Usage, f.Names(), defaultVals)
|
||||||
|
}
|
||||||
|
|
||||||
|
func stringifyStringSliceFlag(f *StringSliceFlag) string {
|
||||||
var defaultVals []string
|
var defaultVals []string
|
||||||
if f.Value != nil && len(f.Value.Value()) > 0 {
|
if f.Value != nil && len(f.Value.Value()) > 0 {
|
||||||
for _, s := range f.Value.Value() {
|
for _, s := range f.Value.Value() {
|
||||||
|
@ -312,10 +354,10 @@ func stringifyStringSliceFlag(f StringSliceFlag) string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return stringifySliceFlag(f.Usage, f.Name, defaultVals)
|
return stringifySliceFlag(f.Usage, f.Names(), defaultVals)
|
||||||
}
|
}
|
||||||
|
|
||||||
func stringifySliceFlag(usage, name string, defaultVals []string) string {
|
func stringifySliceFlag(usage string, names, defaultVals []string) string {
|
||||||
placeholder, usage := unquoteUsage(usage)
|
placeholder, usage := unquoteUsage(usage)
|
||||||
if placeholder == "" {
|
if placeholder == "" {
|
||||||
placeholder = defaultPlaceholder
|
placeholder = defaultPlaceholder
|
||||||
|
@ -326,15 +368,25 @@ func stringifySliceFlag(usage, name string, defaultVals []string) string {
|
||||||
defaultVal = fmt.Sprintf(" (default: %s)", strings.Join(defaultVals, ", "))
|
defaultVal = fmt.Sprintf(" (default: %s)", strings.Join(defaultVals, ", "))
|
||||||
}
|
}
|
||||||
|
|
||||||
usageWithDefault := strings.TrimSpace(usage + defaultVal)
|
usageWithDefault := strings.TrimSpace(fmt.Sprintf("%s%s", usage, defaultVal))
|
||||||
return FlagNamePrefixer(name, placeholder) + "\t" + usageWithDefault
|
return fmt.Sprintf("%s\t%s", prefixedNames(names, placeholder), usageWithDefault)
|
||||||
}
|
}
|
||||||
|
|
||||||
func flagFromFileEnv(filePath, envName string) (val string, ok bool) {
|
func hasFlag(flags []Flag, fl Flag) bool {
|
||||||
for _, envVar := range strings.Split(envName, ",") {
|
for _, existing := range flags {
|
||||||
|
if fl == existing {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func flagFromEnvOrFile(envVars []string, filePath string) (val string, ok bool) {
|
||||||
|
for _, envVar := range envVars {
|
||||||
envVar = strings.TrimSpace(envVar)
|
envVar = strings.TrimSpace(envVar)
|
||||||
if envVal, ok := syscall.Getenv(envVar); ok {
|
if val, ok := syscall.Getenv(envVar); ok {
|
||||||
return envVal, true
|
return val, true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, fileVar := range strings.Split(filePath, ",") {
|
for _, fileVar := range strings.Split(filePath, ",") {
|
93
vendor/github.com/urfave/cli/flag_bool.go → vendor/github.com/urfave/cli/v2/flag_bool.go
generated
vendored
93
vendor/github.com/urfave/cli/flag_bool.go → vendor/github.com/urfave/cli/v2/flag_bool.go
generated
vendored
|
@ -9,93 +9,90 @@ import (
|
||||||
// BoolFlag is a flag with type bool
|
// BoolFlag is a flag with type bool
|
||||||
type BoolFlag struct {
|
type BoolFlag struct {
|
||||||
Name string
|
Name string
|
||||||
|
Aliases []string
|
||||||
Usage string
|
Usage string
|
||||||
EnvVar string
|
EnvVars []string
|
||||||
FilePath string
|
FilePath string
|
||||||
Required bool
|
Required bool
|
||||||
Hidden bool
|
Hidden bool
|
||||||
|
Value bool
|
||||||
|
DefaultText string
|
||||||
Destination *bool
|
Destination *bool
|
||||||
|
HasBeenSet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSet returns whether or not the flag has been set through env or file
|
||||||
|
func (f *BoolFlag) IsSet() bool {
|
||||||
|
return f.HasBeenSet
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns a readable representation of this value
|
// String returns a readable representation of this value
|
||||||
// (for usage defaults)
|
// (for usage defaults)
|
||||||
func (f BoolFlag) String() string {
|
func (f *BoolFlag) String() string {
|
||||||
return FlagStringer(f)
|
return FlagStringer(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetName returns the name of the flag
|
// Names returns the names of the flag
|
||||||
func (f BoolFlag) GetName() string {
|
func (f *BoolFlag) Names() []string {
|
||||||
return f.Name
|
return flagNames(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsRequired returns whether or not the flag is required
|
// IsRequired returns whether or not the flag is required
|
||||||
func (f BoolFlag) IsRequired() bool {
|
func (f *BoolFlag) IsRequired() bool {
|
||||||
return f.Required
|
return f.Required
|
||||||
}
|
}
|
||||||
|
|
||||||
// TakesValue returns true of the flag takes a value, otherwise false
|
// TakesValue returns true of the flag takes a value, otherwise false
|
||||||
func (f BoolFlag) TakesValue() bool {
|
func (f *BoolFlag) TakesValue() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUsage returns the usage string for the flag
|
// GetUsage returns the usage string for the flag
|
||||||
func (f BoolFlag) GetUsage() string {
|
func (f *BoolFlag) GetUsage() string {
|
||||||
return f.Usage
|
return f.Usage
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetValue returns the flags value as string representation and an empty
|
// GetValue returns the flags value as string representation and an empty
|
||||||
// string if the flag takes no value at all.
|
// string if the flag takes no value at all.
|
||||||
func (f BoolFlag) GetValue() string {
|
func (f *BoolFlag) GetValue() string {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Apply populates the flag given the flag set and environment
|
||||||
|
func (f *BoolFlag) Apply(set *flag.FlagSet) error {
|
||||||
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
|
if val != "" {
|
||||||
|
valBool, err := strconv.ParseBool(val)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("could not parse %q as bool value for flag %s: %s", val, f.Name, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
f.Value = valBool
|
||||||
|
f.HasBeenSet = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, name := range f.Names() {
|
||||||
|
if f.Destination != nil {
|
||||||
|
set.BoolVar(f.Destination, name, f.Value, f.Usage)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
set.Bool(name, f.Value, f.Usage)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Bool looks up the value of a local BoolFlag, returns
|
// Bool looks up the value of a local BoolFlag, returns
|
||||||
// false if not found
|
// false if not found
|
||||||
func (c *Context) Bool(name string) bool {
|
func (c *Context) Bool(name string) bool {
|
||||||
return lookupBool(name, c.flagSet)
|
if fs := lookupFlagSet(name, c); fs != nil {
|
||||||
}
|
|
||||||
|
|
||||||
// GlobalBool looks up the value of a global BoolFlag, returns
|
|
||||||
// false if not found
|
|
||||||
func (c *Context) GlobalBool(name string) bool {
|
|
||||||
if fs := lookupGlobalFlagSet(name, c); fs != nil {
|
|
||||||
return lookupBool(name, fs)
|
return lookupBool(name, fs)
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
|
||||||
// Ignores errors
|
|
||||||
func (f BoolFlag) Apply(set *flag.FlagSet) {
|
|
||||||
_ = f.ApplyWithError(set)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ApplyWithError populates the flag given the flag set and environment
|
|
||||||
func (f BoolFlag) ApplyWithError(set *flag.FlagSet) error {
|
|
||||||
val := false
|
|
||||||
if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
|
|
||||||
if envVal == "" {
|
|
||||||
val = false
|
|
||||||
} else {
|
|
||||||
envValBool, err := strconv.ParseBool(envVal)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err)
|
|
||||||
}
|
|
||||||
val = envValBool
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
eachName(f.Name, func(name string) {
|
|
||||||
if f.Destination != nil {
|
|
||||||
set.BoolVar(f.Destination, name, val, f.Usage)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set.Bool(name, val, f.Usage)
|
|
||||||
})
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func lookupBool(name string, set *flag.FlagSet) bool {
|
func lookupBool(name string, set *flag.FlagSet) bool {
|
||||||
f := set.Lookup(name)
|
f := set.Lookup(name)
|
||||||
if f != nil {
|
if f != nil {
|
|
@ -9,90 +9,89 @@ import (
|
||||||
// DurationFlag is a flag with type time.Duration (see https://golang.org/pkg/time/#ParseDuration)
|
// DurationFlag is a flag with type time.Duration (see https://golang.org/pkg/time/#ParseDuration)
|
||||||
type DurationFlag struct {
|
type DurationFlag struct {
|
||||||
Name string
|
Name string
|
||||||
|
Aliases []string
|
||||||
Usage string
|
Usage string
|
||||||
EnvVar string
|
EnvVars []string
|
||||||
FilePath string
|
FilePath string
|
||||||
Required bool
|
Required bool
|
||||||
Hidden bool
|
Hidden bool
|
||||||
Value time.Duration
|
Value time.Duration
|
||||||
|
DefaultText string
|
||||||
Destination *time.Duration
|
Destination *time.Duration
|
||||||
|
HasBeenSet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSet returns whether or not the flag has been set through env or file
|
||||||
|
func (f *DurationFlag) IsSet() bool {
|
||||||
|
return f.HasBeenSet
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns a readable representation of this value
|
// String returns a readable representation of this value
|
||||||
// (for usage defaults)
|
// (for usage defaults)
|
||||||
func (f DurationFlag) String() string {
|
func (f *DurationFlag) String() string {
|
||||||
return FlagStringer(f)
|
return FlagStringer(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetName returns the name of the flag
|
// Names returns the names of the flag
|
||||||
func (f DurationFlag) GetName() string {
|
func (f *DurationFlag) Names() []string {
|
||||||
return f.Name
|
return flagNames(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsRequired returns whether or not the flag is required
|
// IsRequired returns whether or not the flag is required
|
||||||
func (f DurationFlag) IsRequired() bool {
|
func (f *DurationFlag) IsRequired() bool {
|
||||||
return f.Required
|
return f.Required
|
||||||
}
|
}
|
||||||
|
|
||||||
// TakesValue returns true of the flag takes a value, otherwise false
|
// TakesValue returns true of the flag takes a value, otherwise false
|
||||||
func (f DurationFlag) TakesValue() bool {
|
func (f *DurationFlag) TakesValue() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUsage returns the usage string for the flag
|
// GetUsage returns the usage string for the flag
|
||||||
func (f DurationFlag) GetUsage() string {
|
func (f *DurationFlag) GetUsage() string {
|
||||||
return f.Usage
|
return f.Usage
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetValue returns the flags value as string representation and an empty
|
// GetValue returns the flags value as string representation and an empty
|
||||||
// string if the flag takes no value at all.
|
// string if the flag takes no value at all.
|
||||||
func (f DurationFlag) GetValue() string {
|
func (f *DurationFlag) GetValue() string {
|
||||||
return f.Value.String()
|
return f.Value.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Apply populates the flag given the flag set and environment
|
||||||
|
func (f *DurationFlag) Apply(set *flag.FlagSet) error {
|
||||||
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
|
if val != "" {
|
||||||
|
valDuration, err := time.ParseDuration(val)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("could not parse %q as duration value for flag %s: %s", val, f.Name, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
f.Value = valDuration
|
||||||
|
f.HasBeenSet = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, name := range f.Names() {
|
||||||
|
if f.Destination != nil {
|
||||||
|
set.DurationVar(f.Destination, name, f.Value, f.Usage)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
set.Duration(name, f.Value, f.Usage)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Duration looks up the value of a local DurationFlag, returns
|
// Duration looks up the value of a local DurationFlag, returns
|
||||||
// 0 if not found
|
// 0 if not found
|
||||||
func (c *Context) Duration(name string) time.Duration {
|
func (c *Context) Duration(name string) time.Duration {
|
||||||
return lookupDuration(name, c.flagSet)
|
if fs := lookupFlagSet(name, c); fs != nil {
|
||||||
}
|
|
||||||
|
|
||||||
// GlobalDuration looks up the value of a global DurationFlag, returns
|
|
||||||
// 0 if not found
|
|
||||||
func (c *Context) GlobalDuration(name string) time.Duration {
|
|
||||||
if fs := lookupGlobalFlagSet(name, c); fs != nil {
|
|
||||||
return lookupDuration(name, fs)
|
return lookupDuration(name, fs)
|
||||||
}
|
}
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
|
||||||
// Ignores errors
|
|
||||||
func (f DurationFlag) Apply(set *flag.FlagSet) {
|
|
||||||
_ = f.ApplyWithError(set)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ApplyWithError populates the flag given the flag set and environment
|
|
||||||
func (f DurationFlag) ApplyWithError(set *flag.FlagSet) error {
|
|
||||||
if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
|
|
||||||
envValDuration, err := time.ParseDuration(envVal)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("could not parse %s as duration for flag %s: %s", envVal, f.Name, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
f.Value = envValDuration
|
|
||||||
}
|
|
||||||
|
|
||||||
eachName(f.Name, func(name string) {
|
|
||||||
if f.Destination != nil {
|
|
||||||
set.DurationVar(f.Destination, name, f.Value, f.Usage)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set.Duration(name, f.Value, f.Usage)
|
|
||||||
})
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func lookupDuration(name string, set *flag.FlagSet) time.Duration {
|
func lookupDuration(name string, set *flag.FlagSet) time.Duration {
|
||||||
f := set.Lookup(name)
|
f := set.Lookup(name)
|
||||||
if f != nil {
|
if f != nil {
|
|
@ -9,90 +9,90 @@ import (
|
||||||
// Float64Flag is a flag with type float64
|
// Float64Flag is a flag with type float64
|
||||||
type Float64Flag struct {
|
type Float64Flag struct {
|
||||||
Name string
|
Name string
|
||||||
|
Aliases []string
|
||||||
Usage string
|
Usage string
|
||||||
EnvVar string
|
EnvVars []string
|
||||||
FilePath string
|
FilePath string
|
||||||
Required bool
|
Required bool
|
||||||
Hidden bool
|
Hidden bool
|
||||||
Value float64
|
Value float64
|
||||||
|
DefaultText string
|
||||||
Destination *float64
|
Destination *float64
|
||||||
|
HasBeenSet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSet returns whether or not the flag has been set through env or file
|
||||||
|
func (f *Float64Flag) IsSet() bool {
|
||||||
|
return f.HasBeenSet
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns a readable representation of this value
|
// String returns a readable representation of this value
|
||||||
// (for usage defaults)
|
// (for usage defaults)
|
||||||
func (f Float64Flag) String() string {
|
func (f *Float64Flag) String() string {
|
||||||
return FlagStringer(f)
|
return FlagStringer(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetName returns the name of the flag
|
// Names returns the names of the flag
|
||||||
func (f Float64Flag) GetName() string {
|
func (f *Float64Flag) Names() []string {
|
||||||
return f.Name
|
return flagNames(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsRequired returns whether or not the flag is required
|
// IsRequired returns whether or not the flag is required
|
||||||
func (f Float64Flag) IsRequired() bool {
|
func (f *Float64Flag) IsRequired() bool {
|
||||||
return f.Required
|
return f.Required
|
||||||
}
|
}
|
||||||
|
|
||||||
// TakesValue returns true of the flag takes a value, otherwise false
|
// TakesValue returns true of the flag takes a value, otherwise false
|
||||||
func (f Float64Flag) TakesValue() bool {
|
func (f *Float64Flag) TakesValue() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUsage returns the usage string for the flag
|
// GetUsage returns the usage string for the flag
|
||||||
func (f Float64Flag) GetUsage() string {
|
func (f *Float64Flag) GetUsage() string {
|
||||||
return f.Usage
|
return f.Usage
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetValue returns the flags value as string representation and an empty
|
// GetValue returns the flags value as string representation and an empty
|
||||||
// string if the flag takes no value at all.
|
// string if the flag takes no value at all.
|
||||||
func (f Float64Flag) GetValue() string {
|
func (f *Float64Flag) GetValue() string {
|
||||||
return fmt.Sprintf("%f", f.Value)
|
return fmt.Sprintf("%f", f.Value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Apply populates the flag given the flag set and environment
|
||||||
|
func (f *Float64Flag) Apply(set *flag.FlagSet) error {
|
||||||
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
|
if val != "" {
|
||||||
|
valFloat, err := strconv.ParseFloat(val, 10)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("could not parse %q as float64 value for flag %s: %s", val, f.Name, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
f.Value = valFloat
|
||||||
|
f.HasBeenSet = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, name := range f.Names() {
|
||||||
|
if f.Destination != nil {
|
||||||
|
set.Float64Var(f.Destination, name, f.Value, f.Usage)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
set.Float64(name, f.Value, f.Usage)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Float64 looks up the value of a local Float64Flag, returns
|
// Float64 looks up the value of a local Float64Flag, returns
|
||||||
// 0 if not found
|
// 0 if not found
|
||||||
func (c *Context) Float64(name string) float64 {
|
func (c *Context) Float64(name string) float64 {
|
||||||
return lookupFloat64(name, c.flagSet)
|
if fs := lookupFlagSet(name, c); fs != nil {
|
||||||
}
|
|
||||||
|
|
||||||
// GlobalFloat64 looks up the value of a global Float64Flag, returns
|
|
||||||
// 0 if not found
|
|
||||||
func (c *Context) GlobalFloat64(name string) float64 {
|
|
||||||
if fs := lookupGlobalFlagSet(name, c); fs != nil {
|
|
||||||
return lookupFloat64(name, fs)
|
return lookupFloat64(name, fs)
|
||||||
}
|
}
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
|
||||||
// Ignores errors
|
|
||||||
func (f Float64Flag) Apply(set *flag.FlagSet) {
|
|
||||||
_ = f.ApplyWithError(set)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ApplyWithError populates the flag given the flag set and environment
|
|
||||||
func (f Float64Flag) ApplyWithError(set *flag.FlagSet) error {
|
|
||||||
if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
|
|
||||||
envValFloat, err := strconv.ParseFloat(envVal, 10)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("could not parse %s as float64 value for flag %s: %s", envVal, f.Name, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
f.Value = envValFloat
|
|
||||||
}
|
|
||||||
|
|
||||||
eachName(f.Name, func(name string) {
|
|
||||||
if f.Destination != nil {
|
|
||||||
set.Float64Var(f.Destination, name, f.Value, f.Usage)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set.Float64(name, f.Value, f.Usage)
|
|
||||||
})
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func lookupFloat64(name string, set *flag.FlagSet) float64 {
|
func lookupFloat64(name string, set *flag.FlagSet) float64 {
|
||||||
f := set.Lookup(name)
|
f := set.Lookup(name)
|
||||||
if f != nil {
|
if f != nil {
|
165
vendor/github.com/urfave/cli/v2/flag_float64_slice.go
generated
vendored
Normal file
165
vendor/github.com/urfave/cli/v2/flag_float64_slice.go
generated
vendored
Normal file
|
@ -0,0 +1,165 @@
|
||||||
|
package cli
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Float64Slice wraps []float64 to satisfy flag.Value
|
||||||
|
type Float64Slice struct {
|
||||||
|
slice []float64
|
||||||
|
hasBeenSet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFloat64Slice makes a *Float64Slice with default values
|
||||||
|
func NewFloat64Slice(defaults ...float64) *Float64Slice {
|
||||||
|
return &Float64Slice{slice: append([]float64{}, defaults...)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set parses the value into a float64 and appends it to the list of values
|
||||||
|
func (f *Float64Slice) Set(value string) error {
|
||||||
|
if !f.hasBeenSet {
|
||||||
|
f.slice = []float64{}
|
||||||
|
f.hasBeenSet = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.HasPrefix(value, slPfx) {
|
||||||
|
// Deserializing assumes overwrite
|
||||||
|
_ = json.Unmarshal([]byte(strings.Replace(value, slPfx, "", 1)), &f.slice)
|
||||||
|
f.hasBeenSet = true
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp, err := strconv.ParseFloat(value, 64)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
f.slice = append(f.slice, tmp)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns a readable representation of this value (for usage defaults)
|
||||||
|
func (f *Float64Slice) String() string {
|
||||||
|
return fmt.Sprintf("%#v", f.slice)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Serialize allows Float64Slice to fulfill Serializer
|
||||||
|
func (f *Float64Slice) Serialize() string {
|
||||||
|
jsonBytes, _ := json.Marshal(f.slice)
|
||||||
|
return fmt.Sprintf("%s%s", slPfx, string(jsonBytes))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the slice of float64s set by this flag
|
||||||
|
func (f *Float64Slice) Value() []float64 {
|
||||||
|
return f.slice
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get returns the slice of float64s set by this flag
|
||||||
|
func (f *Float64Slice) Get() interface{} {
|
||||||
|
return *f
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64SliceFlag is a flag with type *Float64Slice
|
||||||
|
type Float64SliceFlag struct {
|
||||||
|
Name string
|
||||||
|
Aliases []string
|
||||||
|
Usage string
|
||||||
|
EnvVars []string
|
||||||
|
FilePath string
|
||||||
|
Required bool
|
||||||
|
Hidden bool
|
||||||
|
Value *Float64Slice
|
||||||
|
DefaultText string
|
||||||
|
HasBeenSet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSet returns whether or not the flag has been set through env or file
|
||||||
|
func (f *Float64SliceFlag) IsSet() bool {
|
||||||
|
return f.HasBeenSet
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns a readable representation of this value
|
||||||
|
// (for usage defaults)
|
||||||
|
func (f *Float64SliceFlag) String() string {
|
||||||
|
return FlagStringer(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Names returns the names of the flag
|
||||||
|
func (f *Float64SliceFlag) Names() []string {
|
||||||
|
return flagNames(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsRequired returns whether or not the flag is required
|
||||||
|
func (f *Float64SliceFlag) IsRequired() bool {
|
||||||
|
return f.Required
|
||||||
|
}
|
||||||
|
|
||||||
|
// TakesValue returns true if the flag takes a value, otherwise false
|
||||||
|
func (f *Float64SliceFlag) TakesValue() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUsage returns the usage string for the flag
|
||||||
|
func (f *Float64SliceFlag) GetUsage() string {
|
||||||
|
return f.Usage
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetValue returns the flags value as string representation and an empty
|
||||||
|
// string if the flag takes no value at all.
|
||||||
|
func (f *Float64SliceFlag) GetValue() string {
|
||||||
|
if f.Value != nil {
|
||||||
|
return f.Value.String()
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply populates the flag given the flag set and environment
|
||||||
|
func (f *Float64SliceFlag) Apply(set *flag.FlagSet) error {
|
||||||
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
|
if val != "" {
|
||||||
|
f.Value = &Float64Slice{}
|
||||||
|
|
||||||
|
for _, s := range strings.Split(val, ",") {
|
||||||
|
if err := f.Value.Set(strings.TrimSpace(s)); err != nil {
|
||||||
|
return fmt.Errorf("could not parse %q as float64 slice value for flag %s: %s", f.Value, f.Name, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
f.HasBeenSet = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, name := range f.Names() {
|
||||||
|
if f.Value == nil {
|
||||||
|
f.Value = &Float64Slice{}
|
||||||
|
}
|
||||||
|
set.Var(f.Value, name, f.Usage)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64Slice looks up the value of a local Float64SliceFlag, returns
|
||||||
|
// nil if not found
|
||||||
|
func (c *Context) Float64Slice(name string) []float64 {
|
||||||
|
if fs := lookupFlagSet(name, c); fs != nil {
|
||||||
|
return lookupFloat64Slice(name, fs)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func lookupFloat64Slice(name string, set *flag.FlagSet) []float64 {
|
||||||
|
f := set.Lookup(name)
|
||||||
|
if f != nil {
|
||||||
|
parsed, err := (f.Value.(*Float64Slice)).Value(), error(nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return parsed
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -13,45 +13,53 @@ type Generic interface {
|
||||||
|
|
||||||
// GenericFlag is a flag with type Generic
|
// GenericFlag is a flag with type Generic
|
||||||
type GenericFlag struct {
|
type GenericFlag struct {
|
||||||
Name string
|
Name string
|
||||||
Usage string
|
Aliases []string
|
||||||
EnvVar string
|
Usage string
|
||||||
FilePath string
|
EnvVars []string
|
||||||
Required bool
|
FilePath string
|
||||||
Hidden bool
|
Required bool
|
||||||
TakesFile bool
|
Hidden bool
|
||||||
Value Generic
|
TakesFile bool
|
||||||
|
Value Generic
|
||||||
|
DefaultText string
|
||||||
|
HasBeenSet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSet returns whether or not the flag has been set through env or file
|
||||||
|
func (f *GenericFlag) IsSet() bool {
|
||||||
|
return f.HasBeenSet
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns a readable representation of this value
|
// String returns a readable representation of this value
|
||||||
// (for usage defaults)
|
// (for usage defaults)
|
||||||
func (f GenericFlag) String() string {
|
func (f *GenericFlag) String() string {
|
||||||
return FlagStringer(f)
|
return FlagStringer(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetName returns the name of the flag
|
// Names returns the names of the flag
|
||||||
func (f GenericFlag) GetName() string {
|
func (f *GenericFlag) Names() []string {
|
||||||
return f.Name
|
return flagNames(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsRequired returns whether or not the flag is required
|
// IsRequired returns whether or not the flag is required
|
||||||
func (f GenericFlag) IsRequired() bool {
|
func (f *GenericFlag) IsRequired() bool {
|
||||||
return f.Required
|
return f.Required
|
||||||
}
|
}
|
||||||
|
|
||||||
// TakesValue returns true of the flag takes a value, otherwise false
|
// TakesValue returns true of the flag takes a value, otherwise false
|
||||||
func (f GenericFlag) TakesValue() bool {
|
func (f *GenericFlag) TakesValue() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUsage returns the usage string for the flag
|
// GetUsage returns the usage string for the flag
|
||||||
func (f GenericFlag) GetUsage() string {
|
func (f *GenericFlag) GetUsage() string {
|
||||||
return f.Usage
|
return f.Usage
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetValue returns the flags value as string representation and an empty
|
// GetValue returns the flags value as string representation and an empty
|
||||||
// string if the flag takes no value at all.
|
// string if the flag takes no value at all.
|
||||||
func (f GenericFlag) GetValue() string {
|
func (f *GenericFlag) GetValue() string {
|
||||||
if f.Value != nil {
|
if f.Value != nil {
|
||||||
return f.Value.String()
|
return f.Value.String()
|
||||||
}
|
}
|
||||||
|
@ -60,24 +68,20 @@ func (f GenericFlag) GetValue() string {
|
||||||
|
|
||||||
// Apply takes the flagset and calls Set on the generic flag with the value
|
// Apply takes the flagset and calls Set on the generic flag with the value
|
||||||
// provided by the user for parsing by the flag
|
// provided by the user for parsing by the flag
|
||||||
// Ignores parsing errors
|
func (f GenericFlag) Apply(set *flag.FlagSet) error {
|
||||||
func (f GenericFlag) Apply(set *flag.FlagSet) {
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
_ = f.ApplyWithError(set)
|
if val != "" {
|
||||||
}
|
if err := f.Value.Set(val); err != nil {
|
||||||
|
return fmt.Errorf("could not parse %q as value for flag %s: %s", val, f.Name, err)
|
||||||
|
}
|
||||||
|
|
||||||
// ApplyWithError takes the flagset and calls Set on the generic flag with the value
|
f.HasBeenSet = true
|
||||||
// provided by the user for parsing by the flag
|
|
||||||
func (f GenericFlag) ApplyWithError(set *flag.FlagSet) error {
|
|
||||||
val := f.Value
|
|
||||||
if fileEnvVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
|
|
||||||
if err := val.Set(fileEnvVal); err != nil {
|
|
||||||
return fmt.Errorf("could not parse %s as value for flag %s: %s", fileEnvVal, f.Name, err)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
eachName(f.Name, func(name string) {
|
for _, name := range f.Names() {
|
||||||
set.Var(f.Value, name, f.Usage)
|
set.Var(f.Value, name, f.Usage)
|
||||||
})
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -85,13 +89,7 @@ func (f GenericFlag) ApplyWithError(set *flag.FlagSet) error {
|
||||||
// Generic looks up the value of a local GenericFlag, returns
|
// Generic looks up the value of a local GenericFlag, returns
|
||||||
// nil if not found
|
// nil if not found
|
||||||
func (c *Context) Generic(name string) interface{} {
|
func (c *Context) Generic(name string) interface{} {
|
||||||
return lookupGeneric(name, c.flagSet)
|
if fs := lookupFlagSet(name, c); fs != nil {
|
||||||
}
|
|
||||||
|
|
||||||
// GlobalGeneric looks up the value of a global GenericFlag, returns
|
|
||||||
// nil if not found
|
|
||||||
func (c *Context) GlobalGeneric(name string) interface{} {
|
|
||||||
if fs := lookupGlobalFlagSet(name, c); fs != nil {
|
|
||||||
return lookupGeneric(name, fs)
|
return lookupGeneric(name, fs)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
61
vendor/github.com/urfave/cli/flag_int.go → vendor/github.com/urfave/cli/v2/flag_int.go
generated
vendored
61
vendor/github.com/urfave/cli/flag_int.go → vendor/github.com/urfave/cli/v2/flag_int.go
generated
vendored
|
@ -9,70 +9,77 @@ import (
|
||||||
// IntFlag is a flag with type int
|
// IntFlag is a flag with type int
|
||||||
type IntFlag struct {
|
type IntFlag struct {
|
||||||
Name string
|
Name string
|
||||||
|
Aliases []string
|
||||||
Usage string
|
Usage string
|
||||||
EnvVar string
|
EnvVars []string
|
||||||
FilePath string
|
FilePath string
|
||||||
Required bool
|
Required bool
|
||||||
Hidden bool
|
Hidden bool
|
||||||
Value int
|
Value int
|
||||||
|
DefaultText string
|
||||||
Destination *int
|
Destination *int
|
||||||
|
HasBeenSet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSet returns whether or not the flag has been set through env or file
|
||||||
|
func (f *IntFlag) IsSet() bool {
|
||||||
|
return f.HasBeenSet
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns a readable representation of this value
|
// String returns a readable representation of this value
|
||||||
// (for usage defaults)
|
// (for usage defaults)
|
||||||
func (f IntFlag) String() string {
|
func (f *IntFlag) String() string {
|
||||||
return FlagStringer(f)
|
return FlagStringer(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetName returns the name of the flag
|
// Names returns the names of the flag
|
||||||
func (f IntFlag) GetName() string {
|
func (f *IntFlag) Names() []string {
|
||||||
return f.Name
|
return flagNames(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsRequired returns whether or not the flag is required
|
// IsRequired returns whether or not the flag is required
|
||||||
func (f IntFlag) IsRequired() bool {
|
func (f *IntFlag) IsRequired() bool {
|
||||||
return f.Required
|
return f.Required
|
||||||
}
|
}
|
||||||
|
|
||||||
// TakesValue returns true of the flag takes a value, otherwise false
|
// TakesValue returns true of the flag takes a value, otherwise false
|
||||||
func (f IntFlag) TakesValue() bool {
|
func (f *IntFlag) TakesValue() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUsage returns the usage string for the flag
|
// GetUsage returns the usage string for the flag
|
||||||
func (f IntFlag) GetUsage() string {
|
func (f *IntFlag) GetUsage() string {
|
||||||
return f.Usage
|
return f.Usage
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetValue returns the flags value as string representation and an empty
|
// GetValue returns the flags value as string representation and an empty
|
||||||
// string if the flag takes no value at all.
|
// string if the flag takes no value at all.
|
||||||
func (f IntFlag) GetValue() string {
|
func (f *IntFlag) GetValue() string {
|
||||||
return fmt.Sprintf("%d", f.Value)
|
return fmt.Sprintf("%d", f.Value)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
// Apply populates the flag given the flag set and environment
|
||||||
// Ignores errors
|
func (f *IntFlag) Apply(set *flag.FlagSet) error {
|
||||||
func (f IntFlag) Apply(set *flag.FlagSet) {
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
_ = f.ApplyWithError(set)
|
if val != "" {
|
||||||
}
|
valInt, err := strconv.ParseInt(val, 0, 64)
|
||||||
|
|
||||||
// ApplyWithError populates the flag given the flag set and environment
|
if err != nil {
|
||||||
func (f IntFlag) ApplyWithError(set *flag.FlagSet) error {
|
return fmt.Errorf("could not parse %q as int value for flag %s: %s", val, f.Name, err)
|
||||||
if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
|
}
|
||||||
envValInt, err := strconv.ParseInt(envVal, 0, 64)
|
|
||||||
if err != nil {
|
f.Value = int(valInt)
|
||||||
return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err)
|
f.HasBeenSet = true
|
||||||
}
|
}
|
||||||
f.Value = int(envValInt)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
eachName(f.Name, func(name string) {
|
for _, name := range f.Names() {
|
||||||
if f.Destination != nil {
|
if f.Destination != nil {
|
||||||
set.IntVar(f.Destination, name, f.Value, f.Usage)
|
set.IntVar(f.Destination, name, f.Value, f.Usage)
|
||||||
return
|
continue
|
||||||
}
|
}
|
||||||
set.Int(name, f.Value, f.Usage)
|
set.Int(name, f.Value, f.Usage)
|
||||||
})
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -80,13 +87,7 @@ func (f IntFlag) ApplyWithError(set *flag.FlagSet) error {
|
||||||
// Int looks up the value of a local IntFlag, returns
|
// Int looks up the value of a local IntFlag, returns
|
||||||
// 0 if not found
|
// 0 if not found
|
||||||
func (c *Context) Int(name string) int {
|
func (c *Context) Int(name string) int {
|
||||||
return lookupInt(name, c.flagSet)
|
if fs := lookupFlagSet(name, c); fs != nil {
|
||||||
}
|
|
||||||
|
|
||||||
// GlobalInt looks up the value of a global IntFlag, returns
|
|
||||||
// 0 if not found
|
|
||||||
func (c *Context) GlobalInt(name string) int {
|
|
||||||
if fs := lookupGlobalFlagSet(name, c); fs != nil {
|
|
||||||
return lookupInt(name, fs)
|
return lookupInt(name, fs)
|
||||||
}
|
}
|
||||||
return 0
|
return 0
|
|
@ -9,85 +9,84 @@ import (
|
||||||
// Int64Flag is a flag with type int64
|
// Int64Flag is a flag with type int64
|
||||||
type Int64Flag struct {
|
type Int64Flag struct {
|
||||||
Name string
|
Name string
|
||||||
|
Aliases []string
|
||||||
Usage string
|
Usage string
|
||||||
EnvVar string
|
EnvVars []string
|
||||||
FilePath string
|
FilePath string
|
||||||
Required bool
|
Required bool
|
||||||
Hidden bool
|
Hidden bool
|
||||||
Value int64
|
Value int64
|
||||||
|
DefaultText string
|
||||||
Destination *int64
|
Destination *int64
|
||||||
|
HasBeenSet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSet returns whether or not the flag has been set through env or file
|
||||||
|
func (f *Int64Flag) IsSet() bool {
|
||||||
|
return f.HasBeenSet
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns a readable representation of this value
|
// String returns a readable representation of this value
|
||||||
// (for usage defaults)
|
// (for usage defaults)
|
||||||
func (f Int64Flag) String() string {
|
func (f *Int64Flag) String() string {
|
||||||
return FlagStringer(f)
|
return FlagStringer(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetName returns the name of the flag
|
// Names returns the names of the flag
|
||||||
func (f Int64Flag) GetName() string {
|
func (f *Int64Flag) Names() []string {
|
||||||
return f.Name
|
return flagNames(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsRequired returns whether or not the flag is required
|
// IsRequired returns whether or not the flag is required
|
||||||
func (f Int64Flag) IsRequired() bool {
|
func (f *Int64Flag) IsRequired() bool {
|
||||||
return f.Required
|
return f.Required
|
||||||
}
|
}
|
||||||
|
|
||||||
// TakesValue returns true of the flag takes a value, otherwise false
|
// TakesValue returns true of the flag takes a value, otherwise false
|
||||||
func (f Int64Flag) TakesValue() bool {
|
func (f *Int64Flag) TakesValue() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUsage returns the usage string for the flag
|
// GetUsage returns the usage string for the flag
|
||||||
func (f Int64Flag) GetUsage() string {
|
func (f *Int64Flag) GetUsage() string {
|
||||||
return f.Usage
|
return f.Usage
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetValue returns the flags value as string representation and an empty
|
// GetValue returns the flags value as string representation and an empty
|
||||||
// string if the flag takes no value at all.
|
// string if the flag takes no value at all.
|
||||||
func (f Int64Flag) GetValue() string {
|
func (f *Int64Flag) GetValue() string {
|
||||||
return fmt.Sprintf("%d", f.Value)
|
return fmt.Sprintf("%d", f.Value)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
// Apply populates the flag given the flag set and environment
|
||||||
// Ignores errors
|
func (f *Int64Flag) Apply(set *flag.FlagSet) error {
|
||||||
func (f Int64Flag) Apply(set *flag.FlagSet) {
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
_ = f.ApplyWithError(set)
|
if val != "" {
|
||||||
}
|
valInt, err := strconv.ParseInt(val, 0, 64)
|
||||||
|
|
||||||
// ApplyWithError populates the flag given the flag set and environment
|
if err != nil {
|
||||||
func (f Int64Flag) ApplyWithError(set *flag.FlagSet) error {
|
return fmt.Errorf("could not parse %q as int value for flag %s: %s", val, f.Name, err)
|
||||||
if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
|
}
|
||||||
envValInt, err := strconv.ParseInt(envVal, 0, 64)
|
|
||||||
if err != nil {
|
f.Value = valInt
|
||||||
return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err)
|
f.HasBeenSet = true
|
||||||
}
|
}
|
||||||
|
|
||||||
f.Value = envValInt
|
|
||||||
}
|
}
|
||||||
|
|
||||||
eachName(f.Name, func(name string) {
|
for _, name := range f.Names() {
|
||||||
if f.Destination != nil {
|
if f.Destination != nil {
|
||||||
set.Int64Var(f.Destination, name, f.Value, f.Usage)
|
set.Int64Var(f.Destination, name, f.Value, f.Usage)
|
||||||
return
|
continue
|
||||||
}
|
}
|
||||||
set.Int64(name, f.Value, f.Usage)
|
set.Int64(name, f.Value, f.Usage)
|
||||||
})
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int64 looks up the value of a local Int64Flag, returns
|
// Int64 looks up the value of a local Int64Flag, returns
|
||||||
// 0 if not found
|
// 0 if not found
|
||||||
func (c *Context) Int64(name string) int64 {
|
func (c *Context) Int64(name string) int64 {
|
||||||
return lookupInt64(name, c.flagSet)
|
if fs := lookupFlagSet(name, c); fs != nil {
|
||||||
}
|
|
||||||
|
|
||||||
// GlobalInt64 looks up the value of a global Int64Flag, returns
|
|
||||||
// 0 if not found
|
|
||||||
func (c *Context) GlobalInt64(name string) int64 {
|
|
||||||
if fs := lookupGlobalFlagSet(name, c); fs != nil {
|
|
||||||
return lookupInt64(name, fs)
|
return lookupInt64(name, fs)
|
||||||
}
|
}
|
||||||
return 0
|
return 0
|
161
vendor/github.com/urfave/cli/v2/flag_int64_slice.go
generated
vendored
Normal file
161
vendor/github.com/urfave/cli/v2/flag_int64_slice.go
generated
vendored
Normal file
|
@ -0,0 +1,161 @@
|
||||||
|
package cli
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Int64Slice wraps []int64 to satisfy flag.Value
|
||||||
|
type Int64Slice struct {
|
||||||
|
slice []int64
|
||||||
|
hasBeenSet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInt64Slice makes an *Int64Slice with default values
|
||||||
|
func NewInt64Slice(defaults ...int64) *Int64Slice {
|
||||||
|
return &Int64Slice{slice: append([]int64{}, defaults...)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set parses the value into an integer and appends it to the list of values
|
||||||
|
func (i *Int64Slice) Set(value string) error {
|
||||||
|
if !i.hasBeenSet {
|
||||||
|
i.slice = []int64{}
|
||||||
|
i.hasBeenSet = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.HasPrefix(value, slPfx) {
|
||||||
|
// Deserializing assumes overwrite
|
||||||
|
_ = json.Unmarshal([]byte(strings.Replace(value, slPfx, "", 1)), &i.slice)
|
||||||
|
i.hasBeenSet = true
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp, err := strconv.ParseInt(value, 0, 64)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
i.slice = append(i.slice, tmp)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns a readable representation of this value (for usage defaults)
|
||||||
|
func (i *Int64Slice) String() string {
|
||||||
|
return fmt.Sprintf("%#v", i.slice)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Serialize allows Int64Slice to fulfill Serializer
|
||||||
|
func (i *Int64Slice) Serialize() string {
|
||||||
|
jsonBytes, _ := json.Marshal(i.slice)
|
||||||
|
return fmt.Sprintf("%s%s", slPfx, string(jsonBytes))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the slice of ints set by this flag
|
||||||
|
func (i *Int64Slice) Value() []int64 {
|
||||||
|
return i.slice
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get returns the slice of ints set by this flag
|
||||||
|
func (i *Int64Slice) Get() interface{} {
|
||||||
|
return *i
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64SliceFlag is a flag with type *Int64Slice
|
||||||
|
type Int64SliceFlag struct {
|
||||||
|
Name string
|
||||||
|
Aliases []string
|
||||||
|
Usage string
|
||||||
|
EnvVars []string
|
||||||
|
FilePath string
|
||||||
|
Required bool
|
||||||
|
Hidden bool
|
||||||
|
Value *Int64Slice
|
||||||
|
DefaultText string
|
||||||
|
HasBeenSet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSet returns whether or not the flag has been set through env or file
|
||||||
|
func (f *Int64SliceFlag) IsSet() bool {
|
||||||
|
return f.HasBeenSet
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns a readable representation of this value
|
||||||
|
// (for usage defaults)
|
||||||
|
func (f *Int64SliceFlag) String() string {
|
||||||
|
return FlagStringer(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Names returns the names of the flag
|
||||||
|
func (f *Int64SliceFlag) Names() []string {
|
||||||
|
return flagNames(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsRequired returns whether or not the flag is required
|
||||||
|
func (f *Int64SliceFlag) IsRequired() bool {
|
||||||
|
return f.Required
|
||||||
|
}
|
||||||
|
|
||||||
|
// TakesValue returns true of the flag takes a value, otherwise false
|
||||||
|
func (f *Int64SliceFlag) TakesValue() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUsage returns the usage string for the flag
|
||||||
|
func (f Int64SliceFlag) GetUsage() string {
|
||||||
|
return f.Usage
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetValue returns the flags value as string representation and an empty
|
||||||
|
// string if the flag takes no value at all.
|
||||||
|
func (f *Int64SliceFlag) GetValue() string {
|
||||||
|
if f.Value != nil {
|
||||||
|
return f.Value.String()
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply populates the flag given the flag set and environment
|
||||||
|
func (f *Int64SliceFlag) Apply(set *flag.FlagSet) error {
|
||||||
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
|
f.Value = &Int64Slice{}
|
||||||
|
|
||||||
|
for _, s := range strings.Split(val, ",") {
|
||||||
|
if err := f.Value.Set(strings.TrimSpace(s)); err != nil {
|
||||||
|
return fmt.Errorf("could not parse %q as int64 slice value for flag %s: %s", val, f.Name, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
f.HasBeenSet = true
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, name := range f.Names() {
|
||||||
|
if f.Value == nil {
|
||||||
|
f.Value = &Int64Slice{}
|
||||||
|
}
|
||||||
|
set.Var(f.Value, name, f.Usage)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64Slice looks up the value of a local Int64SliceFlag, returns
|
||||||
|
// nil if not found
|
||||||
|
func (c *Context) Int64Slice(name string) []int64 {
|
||||||
|
return lookupInt64Slice(name, c.flagSet)
|
||||||
|
}
|
||||||
|
|
||||||
|
func lookupInt64Slice(name string, set *flag.FlagSet) []int64 {
|
||||||
|
f := set.Lookup(name)
|
||||||
|
if f != nil {
|
||||||
|
parsed, err := (f.Value.(*Int64Slice)).Value(), error(nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return parsed
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
175
vendor/github.com/urfave/cli/v2/flag_int_slice.go
generated
vendored
Normal file
175
vendor/github.com/urfave/cli/v2/flag_int_slice.go
generated
vendored
Normal file
|
@ -0,0 +1,175 @@
|
||||||
|
package cli
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// IntSlice wraps []int to satisfy flag.Value
|
||||||
|
type IntSlice struct {
|
||||||
|
slice []int
|
||||||
|
hasBeenSet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewIntSlice makes an *IntSlice with default values
|
||||||
|
func NewIntSlice(defaults ...int) *IntSlice {
|
||||||
|
return &IntSlice{slice: append([]int{}, defaults...)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Consistently have specific Set function for Int64 and Float64 ?
|
||||||
|
// SetInt directly adds an integer to the list of values
|
||||||
|
func (i *IntSlice) SetInt(value int) {
|
||||||
|
if !i.hasBeenSet {
|
||||||
|
i.slice = []int{}
|
||||||
|
i.hasBeenSet = true
|
||||||
|
}
|
||||||
|
|
||||||
|
i.slice = append(i.slice, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set parses the value into an integer and appends it to the list of values
|
||||||
|
func (i *IntSlice) Set(value string) error {
|
||||||
|
if !i.hasBeenSet {
|
||||||
|
i.slice = []int{}
|
||||||
|
i.hasBeenSet = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.HasPrefix(value, slPfx) {
|
||||||
|
// Deserializing assumes overwrite
|
||||||
|
_ = json.Unmarshal([]byte(strings.Replace(value, slPfx, "", 1)), &i.slice)
|
||||||
|
i.hasBeenSet = true
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp, err := strconv.ParseInt(value, 0, 64)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
i.slice = append(i.slice, int(tmp))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns a readable representation of this value (for usage defaults)
|
||||||
|
func (i *IntSlice) String() string {
|
||||||
|
return fmt.Sprintf("%#v", i.slice)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Serialize allows IntSlice to fulfill Serializer
|
||||||
|
func (i *IntSlice) Serialize() string {
|
||||||
|
jsonBytes, _ := json.Marshal(i.slice)
|
||||||
|
return fmt.Sprintf("%s%s", slPfx, string(jsonBytes))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the slice of ints set by this flag
|
||||||
|
func (i *IntSlice) Value() []int {
|
||||||
|
return i.slice
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get returns the slice of ints set by this flag
|
||||||
|
func (i *IntSlice) Get() interface{} {
|
||||||
|
return *i
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntSliceFlag is a flag with type *IntSlice
|
||||||
|
type IntSliceFlag struct {
|
||||||
|
Name string
|
||||||
|
Aliases []string
|
||||||
|
Usage string
|
||||||
|
EnvVars []string
|
||||||
|
FilePath string
|
||||||
|
Required bool
|
||||||
|
Hidden bool
|
||||||
|
Value *IntSlice
|
||||||
|
DefaultText string
|
||||||
|
HasBeenSet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSet returns whether or not the flag has been set through env or file
|
||||||
|
func (f *IntSliceFlag) IsSet() bool {
|
||||||
|
return f.HasBeenSet
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns a readable representation of this value
|
||||||
|
// (for usage defaults)
|
||||||
|
func (f *IntSliceFlag) String() string {
|
||||||
|
return FlagStringer(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Names returns the names of the flag
|
||||||
|
func (f *IntSliceFlag) Names() []string {
|
||||||
|
return flagNames(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsRequired returns whether or not the flag is required
|
||||||
|
func (f *IntSliceFlag) IsRequired() bool {
|
||||||
|
return f.Required
|
||||||
|
}
|
||||||
|
|
||||||
|
// TakesValue returns true of the flag takes a value, otherwise false
|
||||||
|
func (f *IntSliceFlag) TakesValue() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUsage returns the usage string for the flag
|
||||||
|
func (f IntSliceFlag) GetUsage() string {
|
||||||
|
return f.Usage
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetValue returns the flags value as string representation and an empty
|
||||||
|
// string if the flag takes no value at all.
|
||||||
|
func (f *IntSliceFlag) GetValue() string {
|
||||||
|
if f.Value != nil {
|
||||||
|
return f.Value.String()
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply populates the flag given the flag set and environment
|
||||||
|
func (f *IntSliceFlag) Apply(set *flag.FlagSet) error {
|
||||||
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
|
f.Value = &IntSlice{}
|
||||||
|
|
||||||
|
for _, s := range strings.Split(val, ",") {
|
||||||
|
if err := f.Value.Set(strings.TrimSpace(s)); err != nil {
|
||||||
|
return fmt.Errorf("could not parse %q as int slice value for flag %s: %s", val, f.Name, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
f.HasBeenSet = true
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, name := range f.Names() {
|
||||||
|
if f.Value == nil {
|
||||||
|
f.Value = &IntSlice{}
|
||||||
|
}
|
||||||
|
set.Var(f.Value, name, f.Usage)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntSlice looks up the value of a local IntSliceFlag, returns
|
||||||
|
// nil if not found
|
||||||
|
func (c *Context) IntSlice(name string) []int {
|
||||||
|
if fs := lookupFlagSet(name, c); fs != nil {
|
||||||
|
return lookupIntSlice(name, c.flagSet)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func lookupIntSlice(name string, set *flag.FlagSet) []int {
|
||||||
|
f := set.Lookup(name)
|
||||||
|
if f != nil {
|
||||||
|
parsed, err := (f.Value.(*IntSlice)).Value(), error(nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return parsed
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
95
vendor/github.com/urfave/cli/v2/flag_path.go
generated
vendored
Normal file
95
vendor/github.com/urfave/cli/v2/flag_path.go
generated
vendored
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
package cli
|
||||||
|
|
||||||
|
import "flag"
|
||||||
|
|
||||||
|
type PathFlag struct {
|
||||||
|
Name string
|
||||||
|
Aliases []string
|
||||||
|
Usage string
|
||||||
|
EnvVars []string
|
||||||
|
FilePath string
|
||||||
|
Required bool
|
||||||
|
Hidden bool
|
||||||
|
TakesFile bool
|
||||||
|
Value string
|
||||||
|
DefaultText string
|
||||||
|
Destination *string
|
||||||
|
HasBeenSet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSet returns whether or not the flag has been set through env or file
|
||||||
|
func (f *PathFlag) IsSet() bool {
|
||||||
|
return f.HasBeenSet
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns a readable representation of this value
|
||||||
|
// (for usage defaults)
|
||||||
|
func (f *PathFlag) String() string {
|
||||||
|
return FlagStringer(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Names returns the names of the flag
|
||||||
|
func (f *PathFlag) Names() []string {
|
||||||
|
return flagNames(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsRequired returns whether or not the flag is required
|
||||||
|
func (f *PathFlag) IsRequired() bool {
|
||||||
|
return f.Required
|
||||||
|
}
|
||||||
|
|
||||||
|
// TakesValue returns true of the flag takes a value, otherwise false
|
||||||
|
func (f *PathFlag) TakesValue() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUsage returns the usage string for the flag
|
||||||
|
func (f *PathFlag) GetUsage() string {
|
||||||
|
return f.Usage
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetValue returns the flags value as string representation and an empty
|
||||||
|
// string if the flag takes no value at all.
|
||||||
|
func (f *PathFlag) GetValue() string {
|
||||||
|
return f.Value
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply populates the flag given the flag set and environment
|
||||||
|
func (f *PathFlag) Apply(set *flag.FlagSet) error {
|
||||||
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
|
f.Value = val
|
||||||
|
f.HasBeenSet = true
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, name := range f.Names() {
|
||||||
|
if f.Destination != nil {
|
||||||
|
set.StringVar(f.Destination, name, f.Value, f.Usage)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
set.String(name, f.Value, f.Usage)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path looks up the value of a local PathFlag, returns
|
||||||
|
// "" if not found
|
||||||
|
func (c *Context) Path(name string) string {
|
||||||
|
if fs := lookupFlagSet(name, c); fs != nil {
|
||||||
|
return lookupPath(name, fs)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func lookupPath(name string, set *flag.FlagSet) string {
|
||||||
|
f := set.Lookup(name)
|
||||||
|
if f != nil {
|
||||||
|
parsed, err := f.Value.String(), error(nil)
|
||||||
|
if err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return parsed
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
|
@ -5,67 +5,70 @@ import "flag"
|
||||||
// StringFlag is a flag with type string
|
// StringFlag is a flag with type string
|
||||||
type StringFlag struct {
|
type StringFlag struct {
|
||||||
Name string
|
Name string
|
||||||
|
Aliases []string
|
||||||
Usage string
|
Usage string
|
||||||
EnvVar string
|
EnvVars []string
|
||||||
FilePath string
|
FilePath string
|
||||||
Required bool
|
Required bool
|
||||||
Hidden bool
|
Hidden bool
|
||||||
TakesFile bool
|
TakesFile bool
|
||||||
Value string
|
Value string
|
||||||
|
DefaultText string
|
||||||
Destination *string
|
Destination *string
|
||||||
|
HasBeenSet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSet returns whether or not the flag has been set through env or file
|
||||||
|
func (f *StringFlag) IsSet() bool {
|
||||||
|
return f.HasBeenSet
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns a readable representation of this value
|
// String returns a readable representation of this value
|
||||||
// (for usage defaults)
|
// (for usage defaults)
|
||||||
func (f StringFlag) String() string {
|
func (f *StringFlag) String() string {
|
||||||
return FlagStringer(f)
|
return FlagStringer(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetName returns the name of the flag
|
// Names returns the names of the flag
|
||||||
func (f StringFlag) GetName() string {
|
func (f *StringFlag) Names() []string {
|
||||||
return f.Name
|
return flagNames(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsRequired returns whether or not the flag is required
|
// IsRequired returns whether or not the flag is required
|
||||||
func (f StringFlag) IsRequired() bool {
|
func (f *StringFlag) IsRequired() bool {
|
||||||
return f.Required
|
return f.Required
|
||||||
}
|
}
|
||||||
|
|
||||||
// TakesValue returns true of the flag takes a value, otherwise false
|
// TakesValue returns true of the flag takes a value, otherwise false
|
||||||
func (f StringFlag) TakesValue() bool {
|
func (f *StringFlag) TakesValue() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUsage returns the usage string for the flag
|
// GetUsage returns the usage string for the flag
|
||||||
func (f StringFlag) GetUsage() string {
|
func (f *StringFlag) GetUsage() string {
|
||||||
return f.Usage
|
return f.Usage
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetValue returns the flags value as string representation and an empty
|
// GetValue returns the flags value as string representation and an empty
|
||||||
// string if the flag takes no value at all.
|
// string if the flag takes no value at all.
|
||||||
func (f StringFlag) GetValue() string {
|
func (f *StringFlag) GetValue() string {
|
||||||
return f.Value
|
return f.Value
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
// Apply populates the flag given the flag set and environment
|
||||||
// Ignores errors
|
func (f *StringFlag) Apply(set *flag.FlagSet) error {
|
||||||
func (f StringFlag) Apply(set *flag.FlagSet) {
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
_ = f.ApplyWithError(set)
|
f.Value = val
|
||||||
}
|
f.HasBeenSet = true
|
||||||
|
|
||||||
// ApplyWithError populates the flag given the flag set and environment
|
|
||||||
func (f StringFlag) ApplyWithError(set *flag.FlagSet) error {
|
|
||||||
if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
|
|
||||||
f.Value = envVal
|
|
||||||
}
|
}
|
||||||
|
|
||||||
eachName(f.Name, func(name string) {
|
for _, name := range f.Names() {
|
||||||
if f.Destination != nil {
|
if f.Destination != nil {
|
||||||
set.StringVar(f.Destination, name, f.Value, f.Usage)
|
set.StringVar(f.Destination, name, f.Value, f.Usage)
|
||||||
return
|
continue
|
||||||
}
|
}
|
||||||
set.String(name, f.Value, f.Usage)
|
set.String(name, f.Value, f.Usage)
|
||||||
})
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -73,13 +76,7 @@ func (f StringFlag) ApplyWithError(set *flag.FlagSet) error {
|
||||||
// String looks up the value of a local StringFlag, returns
|
// String looks up the value of a local StringFlag, returns
|
||||||
// "" if not found
|
// "" if not found
|
||||||
func (c *Context) String(name string) string {
|
func (c *Context) String(name string) string {
|
||||||
return lookupString(name, c.flagSet)
|
if fs := lookupFlagSet(name, c); fs != nil {
|
||||||
}
|
|
||||||
|
|
||||||
// GlobalString looks up the value of a global StringFlag, returns
|
|
||||||
// "" if not found
|
|
||||||
func (c *Context) GlobalString(name string) string {
|
|
||||||
if fs := lookupGlobalFlagSet(name, c); fs != nil {
|
|
||||||
return lookupString(name, fs)
|
return lookupString(name, fs)
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
159
vendor/github.com/urfave/cli/v2/flag_string_slice.go
generated
vendored
Normal file
159
vendor/github.com/urfave/cli/v2/flag_string_slice.go
generated
vendored
Normal file
|
@ -0,0 +1,159 @@
|
||||||
|
package cli
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// StringSlice wraps a []string to satisfy flag.Value
|
||||||
|
type StringSlice struct {
|
||||||
|
slice []string
|
||||||
|
hasBeenSet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewStringSlice creates a *StringSlice with default values
|
||||||
|
func NewStringSlice(defaults ...string) *StringSlice {
|
||||||
|
return &StringSlice{slice: append([]string{}, defaults...)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set appends the string value to the list of values
|
||||||
|
func (s *StringSlice) Set(value string) error {
|
||||||
|
if !s.hasBeenSet {
|
||||||
|
s.slice = []string{}
|
||||||
|
s.hasBeenSet = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.HasPrefix(value, slPfx) {
|
||||||
|
// Deserializing assumes overwrite
|
||||||
|
_ = json.Unmarshal([]byte(strings.Replace(value, slPfx, "", 1)), &s.slice)
|
||||||
|
s.hasBeenSet = true
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
s.slice = append(s.slice, value)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns a readable representation of this value (for usage defaults)
|
||||||
|
func (s *StringSlice) String() string {
|
||||||
|
return fmt.Sprintf("%s", s.slice)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Serialize allows StringSlice to fulfill Serializer
|
||||||
|
func (s *StringSlice) Serialize() string {
|
||||||
|
jsonBytes, _ := json.Marshal(s.slice)
|
||||||
|
return fmt.Sprintf("%s%s", slPfx, string(jsonBytes))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the slice of strings set by this flag
|
||||||
|
func (s *StringSlice) Value() []string {
|
||||||
|
return s.slice
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get returns the slice of strings set by this flag
|
||||||
|
func (s *StringSlice) Get() interface{} {
|
||||||
|
return *s
|
||||||
|
}
|
||||||
|
|
||||||
|
// StringSliceFlag is a flag with type *StringSlice
|
||||||
|
type StringSliceFlag struct {
|
||||||
|
Name string
|
||||||
|
Aliases []string
|
||||||
|
Usage string
|
||||||
|
EnvVars []string
|
||||||
|
FilePath string
|
||||||
|
Required bool
|
||||||
|
Hidden bool
|
||||||
|
TakesFile bool
|
||||||
|
Value *StringSlice
|
||||||
|
DefaultText string
|
||||||
|
HasBeenSet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSet returns whether or not the flag has been set through env or file
|
||||||
|
func (f *StringSliceFlag) IsSet() bool {
|
||||||
|
return f.HasBeenSet
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns a readable representation of this value
|
||||||
|
// (for usage defaults)
|
||||||
|
func (f *StringSliceFlag) String() string {
|
||||||
|
return FlagStringer(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Names returns the names of the flag
|
||||||
|
func (f *StringSliceFlag) Names() []string {
|
||||||
|
return flagNames(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsRequired returns whether or not the flag is required
|
||||||
|
func (f *StringSliceFlag) IsRequired() bool {
|
||||||
|
return f.Required
|
||||||
|
}
|
||||||
|
|
||||||
|
// TakesValue returns true of the flag takes a value, otherwise false
|
||||||
|
func (f *StringSliceFlag) TakesValue() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUsage returns the usage string for the flag
|
||||||
|
func (f *StringSliceFlag) GetUsage() string {
|
||||||
|
return f.Usage
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetValue returns the flags value as string representation and an empty
|
||||||
|
// string if the flag takes no value at all.
|
||||||
|
func (f *StringSliceFlag) GetValue() string {
|
||||||
|
if f.Value != nil {
|
||||||
|
return f.Value.String()
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply populates the flag given the flag set and environment
|
||||||
|
func (f *StringSliceFlag) Apply(set *flag.FlagSet) error {
|
||||||
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
|
f.Value = &StringSlice{}
|
||||||
|
|
||||||
|
for _, s := range strings.Split(val, ",") {
|
||||||
|
if err := f.Value.Set(strings.TrimSpace(s)); err != nil {
|
||||||
|
return fmt.Errorf("could not parse %q as string value for flag %s: %s", val, f.Name, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
f.HasBeenSet = true
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, name := range f.Names() {
|
||||||
|
if f.Value == nil {
|
||||||
|
f.Value = &StringSlice{}
|
||||||
|
}
|
||||||
|
set.Var(f.Value, name, f.Usage)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// StringSlice looks up the value of a local StringSliceFlag, returns
|
||||||
|
// nil if not found
|
||||||
|
func (c *Context) StringSlice(name string) []string {
|
||||||
|
if fs := lookupFlagSet(name, c); fs != nil {
|
||||||
|
return lookupStringSlice(name, fs)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func lookupStringSlice(name string, set *flag.FlagSet) []string {
|
||||||
|
f := set.Lookup(name)
|
||||||
|
if f != nil {
|
||||||
|
parsed, err := (f.Value.(*StringSlice)).Value(), error(nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return parsed
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
152
vendor/github.com/urfave/cli/v2/flag_timestamp.go
generated
vendored
Normal file
152
vendor/github.com/urfave/cli/v2/flag_timestamp.go
generated
vendored
Normal file
|
@ -0,0 +1,152 @@
|
||||||
|
package cli
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Timestamp wrap to satisfy golang's flag interface.
|
||||||
|
type Timestamp struct {
|
||||||
|
timestamp *time.Time
|
||||||
|
hasBeenSet bool
|
||||||
|
layout string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Timestamp constructor
|
||||||
|
func NewTimestamp(timestamp time.Time) *Timestamp {
|
||||||
|
return &Timestamp{timestamp: ×tamp}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the timestamp value directly
|
||||||
|
func (t *Timestamp) SetTimestamp(value time.Time) {
|
||||||
|
if !t.hasBeenSet {
|
||||||
|
t.timestamp = &value
|
||||||
|
t.hasBeenSet = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the timestamp string layout for future parsing
|
||||||
|
func (t *Timestamp) SetLayout(layout string) {
|
||||||
|
t.layout = layout
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parses the string value to timestamp
|
||||||
|
func (t *Timestamp) Set(value string) error {
|
||||||
|
timestamp, err := time.Parse(t.layout, value)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
t.timestamp = ×tamp
|
||||||
|
t.hasBeenSet = true
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns a readable representation of this value (for usage defaults)
|
||||||
|
func (t *Timestamp) String() string {
|
||||||
|
return fmt.Sprintf("%#v", t.timestamp)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the timestamp value stored in the flag
|
||||||
|
func (t *Timestamp) Value() *time.Time {
|
||||||
|
return t.timestamp
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get returns the flag structure
|
||||||
|
func (t *Timestamp) Get() interface{} {
|
||||||
|
return *t
|
||||||
|
}
|
||||||
|
|
||||||
|
// TimestampFlag is a flag with type time
|
||||||
|
type TimestampFlag struct {
|
||||||
|
Name string
|
||||||
|
Aliases []string
|
||||||
|
Usage string
|
||||||
|
EnvVars []string
|
||||||
|
FilePath string
|
||||||
|
Required bool
|
||||||
|
Hidden bool
|
||||||
|
Layout string
|
||||||
|
Value *Timestamp
|
||||||
|
DefaultText string
|
||||||
|
HasBeenSet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSet returns whether or not the flag has been set through env or file
|
||||||
|
func (f *TimestampFlag) IsSet() bool {
|
||||||
|
return f.HasBeenSet
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns a readable representation of this value
|
||||||
|
// (for usage defaults)
|
||||||
|
func (f *TimestampFlag) String() string {
|
||||||
|
return FlagStringer(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Names returns the names of the flag
|
||||||
|
func (f *TimestampFlag) Names() []string {
|
||||||
|
return flagNames(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsRequired returns whether or not the flag is required
|
||||||
|
func (f *TimestampFlag) IsRequired() bool {
|
||||||
|
return f.Required
|
||||||
|
}
|
||||||
|
|
||||||
|
// TakesValue returns true of the flag takes a value, otherwise false
|
||||||
|
func (f *TimestampFlag) TakesValue() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUsage returns the usage string for the flag
|
||||||
|
func (f *TimestampFlag) GetUsage() string {
|
||||||
|
return f.Usage
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetValue returns the flags value as string representation and an empty
|
||||||
|
// string if the flag takes no value at all.
|
||||||
|
func (f *TimestampFlag) GetValue() string {
|
||||||
|
if f.Value != nil {
|
||||||
|
return f.Value.timestamp.String()
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply populates the flag given the flag set and environment
|
||||||
|
func (f *TimestampFlag) Apply(set *flag.FlagSet) error {
|
||||||
|
if f.Layout == "" {
|
||||||
|
return fmt.Errorf("timestamp Layout is required")
|
||||||
|
}
|
||||||
|
f.Value = &Timestamp{}
|
||||||
|
f.Value.SetLayout(f.Layout)
|
||||||
|
|
||||||
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
|
if err := f.Value.Set(val); err != nil {
|
||||||
|
return fmt.Errorf("could not parse %q as timestamp value for flag %s: %s", val, f.Name, err)
|
||||||
|
}
|
||||||
|
f.HasBeenSet = true
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, name := range f.Names() {
|
||||||
|
set.Var(f.Value, name, f.Usage)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Timestamp gets the timestamp from a flag name
|
||||||
|
func (c *Context) Timestamp(name string) *time.Time {
|
||||||
|
if fs := lookupFlagSet(name, c); fs != nil {
|
||||||
|
return lookupTimestamp(name, fs)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fetches the timestamp value from the local timestampWrap
|
||||||
|
func lookupTimestamp(name string, set *flag.FlagSet) *time.Time {
|
||||||
|
f := set.Lookup(name)
|
||||||
|
if f != nil {
|
||||||
|
return (f.Value.(*Timestamp)).Value()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
61
vendor/github.com/urfave/cli/flag_uint.go → vendor/github.com/urfave/cli/v2/flag_uint.go
generated
vendored
61
vendor/github.com/urfave/cli/flag_uint.go → vendor/github.com/urfave/cli/v2/flag_uint.go
generated
vendored
|
@ -9,85 +9,84 @@ import (
|
||||||
// UintFlag is a flag with type uint
|
// UintFlag is a flag with type uint
|
||||||
type UintFlag struct {
|
type UintFlag struct {
|
||||||
Name string
|
Name string
|
||||||
|
Aliases []string
|
||||||
Usage string
|
Usage string
|
||||||
EnvVar string
|
EnvVars []string
|
||||||
FilePath string
|
FilePath string
|
||||||
Required bool
|
Required bool
|
||||||
Hidden bool
|
Hidden bool
|
||||||
Value uint
|
Value uint
|
||||||
|
DefaultText string
|
||||||
Destination *uint
|
Destination *uint
|
||||||
|
HasBeenSet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSet returns whether or not the flag has been set through env or file
|
||||||
|
func (f *UintFlag) IsSet() bool {
|
||||||
|
return f.HasBeenSet
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns a readable representation of this value
|
// String returns a readable representation of this value
|
||||||
// (for usage defaults)
|
// (for usage defaults)
|
||||||
func (f UintFlag) String() string {
|
func (f *UintFlag) String() string {
|
||||||
return FlagStringer(f)
|
return FlagStringer(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetName returns the name of the flag
|
// Names returns the names of the flag
|
||||||
func (f UintFlag) GetName() string {
|
func (f *UintFlag) Names() []string {
|
||||||
return f.Name
|
return flagNames(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsRequired returns whether or not the flag is required
|
// IsRequired returns whether or not the flag is required
|
||||||
func (f UintFlag) IsRequired() bool {
|
func (f *UintFlag) IsRequired() bool {
|
||||||
return f.Required
|
return f.Required
|
||||||
}
|
}
|
||||||
|
|
||||||
// TakesValue returns true of the flag takes a value, otherwise false
|
// TakesValue returns true of the flag takes a value, otherwise false
|
||||||
func (f UintFlag) TakesValue() bool {
|
func (f *UintFlag) TakesValue() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUsage returns the usage string for the flag
|
// GetUsage returns the usage string for the flag
|
||||||
func (f UintFlag) GetUsage() string {
|
func (f *UintFlag) GetUsage() string {
|
||||||
return f.Usage
|
return f.Usage
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
// Apply populates the flag given the flag set and environment
|
||||||
// Ignores errors
|
func (f *UintFlag) Apply(set *flag.FlagSet) error {
|
||||||
func (f UintFlag) Apply(set *flag.FlagSet) {
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
_ = f.ApplyWithError(set)
|
if val != "" {
|
||||||
}
|
valInt, err := strconv.ParseUint(val, 0, 64)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("could not parse %q as uint value for flag %s: %s", val, f.Name, err)
|
||||||
|
}
|
||||||
|
|
||||||
// ApplyWithError populates the flag given the flag set and environment
|
f.Value = uint(valInt)
|
||||||
func (f UintFlag) ApplyWithError(set *flag.FlagSet) error {
|
f.HasBeenSet = true
|
||||||
if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
|
|
||||||
envValInt, err := strconv.ParseUint(envVal, 0, 64)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("could not parse %s as uint value for flag %s: %s", envVal, f.Name, err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
f.Value = uint(envValInt)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
eachName(f.Name, func(name string) {
|
for _, name := range f.Names() {
|
||||||
if f.Destination != nil {
|
if f.Destination != nil {
|
||||||
set.UintVar(f.Destination, name, f.Value, f.Usage)
|
set.UintVar(f.Destination, name, f.Value, f.Usage)
|
||||||
return
|
continue
|
||||||
}
|
}
|
||||||
set.Uint(name, f.Value, f.Usage)
|
set.Uint(name, f.Value, f.Usage)
|
||||||
})
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetValue returns the flags value as string representation and an empty
|
// GetValue returns the flags value as string representation and an empty
|
||||||
// string if the flag takes no value at all.
|
// string if the flag takes no value at all.
|
||||||
func (f UintFlag) GetValue() string {
|
func (f *UintFlag) GetValue() string {
|
||||||
return fmt.Sprintf("%d", f.Value)
|
return fmt.Sprintf("%d", f.Value)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint looks up the value of a local UintFlag, returns
|
// Uint looks up the value of a local UintFlag, returns
|
||||||
// 0 if not found
|
// 0 if not found
|
||||||
func (c *Context) Uint(name string) uint {
|
func (c *Context) Uint(name string) uint {
|
||||||
return lookupUint(name, c.flagSet)
|
if fs := lookupFlagSet(name, c); fs != nil {
|
||||||
}
|
|
||||||
|
|
||||||
// GlobalUint looks up the value of a global UintFlag, returns
|
|
||||||
// 0 if not found
|
|
||||||
func (c *Context) GlobalUint(name string) uint {
|
|
||||||
if fs := lookupGlobalFlagSet(name, c); fs != nil {
|
|
||||||
return lookupUint(name, fs)
|
return lookupUint(name, fs)
|
||||||
}
|
}
|
||||||
return 0
|
return 0
|
|
@ -9,85 +9,84 @@ import (
|
||||||
// Uint64Flag is a flag with type uint64
|
// Uint64Flag is a flag with type uint64
|
||||||
type Uint64Flag struct {
|
type Uint64Flag struct {
|
||||||
Name string
|
Name string
|
||||||
|
Aliases []string
|
||||||
Usage string
|
Usage string
|
||||||
EnvVar string
|
EnvVars []string
|
||||||
FilePath string
|
FilePath string
|
||||||
Required bool
|
Required bool
|
||||||
Hidden bool
|
Hidden bool
|
||||||
Value uint64
|
Value uint64
|
||||||
|
DefaultText string
|
||||||
Destination *uint64
|
Destination *uint64
|
||||||
|
HasBeenSet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSet returns whether or not the flag has been set through env or file
|
||||||
|
func (f *Uint64Flag) IsSet() bool {
|
||||||
|
return f.HasBeenSet
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns a readable representation of this value
|
// String returns a readable representation of this value
|
||||||
// (for usage defaults)
|
// (for usage defaults)
|
||||||
func (f Uint64Flag) String() string {
|
func (f *Uint64Flag) String() string {
|
||||||
return FlagStringer(f)
|
return FlagStringer(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetName returns the name of the flag
|
// Names returns the names of the flag
|
||||||
func (f Uint64Flag) GetName() string {
|
func (f *Uint64Flag) Names() []string {
|
||||||
return f.Name
|
return flagNames(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsRequired returns whether or not the flag is required
|
// IsRequired returns whether or not the flag is required
|
||||||
func (f Uint64Flag) IsRequired() bool {
|
func (f *Uint64Flag) IsRequired() bool {
|
||||||
return f.Required
|
return f.Required
|
||||||
}
|
}
|
||||||
|
|
||||||
// TakesValue returns true of the flag takes a value, otherwise false
|
// TakesValue returns true of the flag takes a value, otherwise false
|
||||||
func (f Uint64Flag) TakesValue() bool {
|
func (f *Uint64Flag) TakesValue() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUsage returns the usage string for the flag
|
// GetUsage returns the usage string for the flag
|
||||||
func (f Uint64Flag) GetUsage() string {
|
func (f *Uint64Flag) GetUsage() string {
|
||||||
return f.Usage
|
return f.Usage
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Apply populates the flag given the flag set and environment
|
||||||
|
func (f *Uint64Flag) Apply(set *flag.FlagSet) error {
|
||||||
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
|
if val != "" {
|
||||||
|
valInt, err := strconv.ParseUint(val, 0, 64)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("could not parse %q as uint64 value for flag %s: %s", val, f.Name, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
f.Value = valInt
|
||||||
|
f.HasBeenSet = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, name := range f.Names() {
|
||||||
|
if f.Destination != nil {
|
||||||
|
set.Uint64Var(f.Destination, name, f.Value, f.Usage)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
set.Uint64(name, f.Value, f.Usage)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// GetValue returns the flags value as string representation and an empty
|
// GetValue returns the flags value as string representation and an empty
|
||||||
// string if the flag takes no value at all.
|
// string if the flag takes no value at all.
|
||||||
func (f Uint64Flag) GetValue() string {
|
func (f *Uint64Flag) GetValue() string {
|
||||||
return fmt.Sprintf("%d", f.Value)
|
return fmt.Sprintf("%d", f.Value)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
|
||||||
// Ignores errors
|
|
||||||
func (f Uint64Flag) Apply(set *flag.FlagSet) {
|
|
||||||
_ = f.ApplyWithError(set)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ApplyWithError populates the flag given the flag set and environment
|
|
||||||
func (f Uint64Flag) ApplyWithError(set *flag.FlagSet) error {
|
|
||||||
if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
|
|
||||||
envValInt, err := strconv.ParseUint(envVal, 0, 64)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("could not parse %s as uint64 value for flag %s: %s", envVal, f.Name, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
f.Value = envValInt
|
|
||||||
}
|
|
||||||
|
|
||||||
eachName(f.Name, func(name string) {
|
|
||||||
if f.Destination != nil {
|
|
||||||
set.Uint64Var(f.Destination, name, f.Value, f.Usage)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set.Uint64(name, f.Value, f.Usage)
|
|
||||||
})
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint64 looks up the value of a local Uint64Flag, returns
|
// Uint64 looks up the value of a local Uint64Flag, returns
|
||||||
// 0 if not found
|
// 0 if not found
|
||||||
func (c *Context) Uint64(name string) uint64 {
|
func (c *Context) Uint64(name string) uint64 {
|
||||||
return lookupUint64(name, c.flagSet)
|
if fs := lookupFlagSet(name, c); fs != nil {
|
||||||
}
|
|
||||||
|
|
||||||
// GlobalUint64 looks up the value of a global Uint64Flag, returns
|
|
||||||
// 0 if not found
|
|
||||||
func (c *Context) GlobalUint64(name string) uint64 {
|
|
||||||
if fs := lookupGlobalFlagSet(name, c); fs != nil {
|
|
||||||
return lookupUint64(name, fs)
|
return lookupUint64(name, fs)
|
||||||
}
|
}
|
||||||
return 0
|
return 0
|
8
vendor/github.com/urfave/cli/funcs.go → vendor/github.com/urfave/cli/v2/funcs.go
generated
vendored
8
vendor/github.com/urfave/cli/funcs.go → vendor/github.com/urfave/cli/v2/funcs.go
generated
vendored
|
@ -1,6 +1,6 @@
|
||||||
package cli
|
package cli
|
||||||
|
|
||||||
// BashCompleteFunc is an action to execute when the bash-completion flag is set
|
// BashCompleteFunc is an action to execute when the shell completion flag is set
|
||||||
type BashCompleteFunc func(*Context)
|
type BashCompleteFunc func(*Context)
|
||||||
|
|
||||||
// BeforeFunc is an action to execute before any subcommands are run, but after
|
// BeforeFunc is an action to execute before any subcommands are run, but after
|
||||||
|
@ -23,7 +23,7 @@ type CommandNotFoundFunc func(*Context, string)
|
||||||
// is displayed and the execution is interrupted.
|
// is displayed and the execution is interrupted.
|
||||||
type OnUsageErrorFunc func(context *Context, err error, isSubcommand bool) error
|
type OnUsageErrorFunc func(context *Context, err error, isSubcommand bool) error
|
||||||
|
|
||||||
// ExitErrHandlerFunc is executed if provided in order to handle ExitError values
|
// ExitErrHandlerFunc is executed if provided in order to handle exitError values
|
||||||
// returned by Actions and Before/After functions.
|
// returned by Actions and Before/After functions.
|
||||||
type ExitErrHandlerFunc func(context *Context, err error)
|
type ExitErrHandlerFunc func(context *Context, err error)
|
||||||
|
|
||||||
|
@ -33,11 +33,11 @@ type FlagStringFunc func(Flag) string
|
||||||
|
|
||||||
// FlagNamePrefixFunc is used by the default FlagStringFunc to create prefix
|
// FlagNamePrefixFunc is used by the default FlagStringFunc to create prefix
|
||||||
// text for a flag's full name.
|
// text for a flag's full name.
|
||||||
type FlagNamePrefixFunc func(fullName, placeholder string) string
|
type FlagNamePrefixFunc func(fullName []string, placeholder string) string
|
||||||
|
|
||||||
// FlagEnvHintFunc is used by the default FlagStringFunc to annotate flag help
|
// FlagEnvHintFunc is used by the default FlagStringFunc to annotate flag help
|
||||||
// with the environment variable details.
|
// with the environment variable details.
|
||||||
type FlagEnvHintFunc func(envVar, str string) string
|
type FlagEnvHintFunc func(envVars []string, str string) string
|
||||||
|
|
||||||
// FlagFileHintFunc is used by the default FlagStringFunc to annotate flag help
|
// FlagFileHintFunc is used by the default FlagStringFunc to annotate flag help
|
||||||
// with the file path details.
|
// with the file path details.
|
2
vendor/github.com/urfave/cli/go.mod → vendor/github.com/urfave/cli/v2/go.mod
generated
vendored
2
vendor/github.com/urfave/cli/go.mod → vendor/github.com/urfave/cli/v2/go.mod
generated
vendored
|
@ -1,4 +1,4 @@
|
||||||
module github.com/urfave/cli
|
module github.com/urfave/cli/v2
|
||||||
|
|
||||||
go 1.11
|
go 1.11
|
||||||
|
|
0
vendor/github.com/urfave/cli/go.sum → vendor/github.com/urfave/cli/v2/go.sum
generated
vendored
0
vendor/github.com/urfave/cli/go.sum → vendor/github.com/urfave/cli/v2/go.sum
generated
vendored
47
vendor/github.com/urfave/cli/help.go → vendor/github.com/urfave/cli/v2/help.go
generated
vendored
47
vendor/github.com/urfave/cli/help.go → vendor/github.com/urfave/cli/v2/help.go
generated
vendored
|
@ -10,7 +10,7 @@ import (
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
)
|
)
|
||||||
|
|
||||||
var helpCommand = Command{
|
var helpCommand = &Command{
|
||||||
Name: "help",
|
Name: "help",
|
||||||
Aliases: []string{"h"},
|
Aliases: []string{"h"},
|
||||||
Usage: "Shows a list of commands or help for one command",
|
Usage: "Shows a list of commands or help for one command",
|
||||||
|
@ -26,7 +26,7 @@ var helpCommand = Command{
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var helpSubcommand = Command{
|
var helpSubcommand = &Command{
|
||||||
Name: "help",
|
Name: "help",
|
||||||
Aliases: []string{"h"},
|
Aliases: []string{"h"},
|
||||||
Usage: "Shows a list of commands or help for one command",
|
Usage: "Shows a list of commands or help for one command",
|
||||||
|
@ -97,7 +97,7 @@ func DefaultAppComplete(c *Context) {
|
||||||
DefaultCompleteWithFlags(nil)(c)
|
DefaultCompleteWithFlags(nil)(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
func printCommandSuggestions(commands []Command, writer io.Writer) {
|
func printCommandSuggestions(commands []*Command, writer io.Writer) {
|
||||||
for _, command := range commands {
|
for _, command := range commands {
|
||||||
if command.Hidden {
|
if command.Hidden {
|
||||||
continue
|
continue
|
||||||
|
@ -135,10 +135,10 @@ func printFlagSuggestions(lastArg string, flags []Flag, writer io.Writer) {
|
||||||
cur := strings.TrimPrefix(lastArg, "-")
|
cur := strings.TrimPrefix(lastArg, "-")
|
||||||
cur = strings.TrimPrefix(cur, "-")
|
cur = strings.TrimPrefix(cur, "-")
|
||||||
for _, flag := range flags {
|
for _, flag := range flags {
|
||||||
if bflag, ok := flag.(BoolFlag); ok && bflag.Hidden {
|
if bflag, ok := flag.(*BoolFlag); ok && bflag.Hidden {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
for _, name := range strings.Split(flag.GetName(), ",") {
|
for _, name := range flag.Names() {
|
||||||
name = strings.TrimSpace(name)
|
name = strings.TrimSpace(name)
|
||||||
// this will get total count utf8 letters in flag name
|
// this will get total count utf8 letters in flag name
|
||||||
count := utf8.RuneCountInString(name)
|
count := utf8.RuneCountInString(name)
|
||||||
|
@ -151,7 +151,7 @@ func printFlagSuggestions(lastArg string, flags []Flag, writer io.Writer) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// match if last argument matches this flag and it is not repeated
|
// match if last argument matches this flag and it is not repeated
|
||||||
if strings.HasPrefix(name, cur) && cur != name && !cliArgContains(flag.GetName()) {
|
if strings.HasPrefix(name, cur) && cur != name && !cliArgContains(name) {
|
||||||
flagCompletion := fmt.Sprintf("%s%s", strings.Repeat("-", count), name)
|
flagCompletion := fmt.Sprintf("%s%s", strings.Repeat("-", count), name)
|
||||||
_, _ = fmt.Fprintln(writer, flagCompletion)
|
_, _ = fmt.Fprintln(writer, flagCompletion)
|
||||||
}
|
}
|
||||||
|
@ -207,7 +207,7 @@ func ShowCommandHelp(ctx *Context, command string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ctx.App.CommandNotFound == nil {
|
if ctx.App.CommandNotFound == nil {
|
||||||
return NewExitError(fmt.Sprintf("No help topic for '%v'", command), 3)
|
return Exit(fmt.Sprintf("No help topic for '%v'", command), 3)
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.App.CommandNotFound(ctx, command)
|
ctx.App.CommandNotFound(ctx, command)
|
||||||
|
@ -216,7 +216,15 @@ func ShowCommandHelp(ctx *Context, command string) error {
|
||||||
|
|
||||||
// ShowSubcommandHelp prints help for the given subcommand
|
// ShowSubcommandHelp prints help for the given subcommand
|
||||||
func ShowSubcommandHelp(c *Context) error {
|
func ShowSubcommandHelp(c *Context) error {
|
||||||
return ShowCommandHelp(c, c.Command.Name)
|
if c == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.Command != nil {
|
||||||
|
return ShowCommandHelp(c, c.Command.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ShowCommandHelp(c, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
// ShowVersion prints the version number of the App
|
// ShowVersion prints the version number of the App
|
||||||
|
@ -263,6 +271,7 @@ func printHelpCustom(out io.Writer, templ string, data interface{}, customFuncs
|
||||||
|
|
||||||
w := tabwriter.NewWriter(out, 1, 8, 2, ' ', 0)
|
w := tabwriter.NewWriter(out, 1, 8, 2, ' ', 0)
|
||||||
t := template.Must(template.New("help").Funcs(funcMap).Parse(templ))
|
t := template.Must(template.New("help").Funcs(funcMap).Parse(templ))
|
||||||
|
|
||||||
err := t.Execute(w, data)
|
err := t.Execute(w, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// If the writer is closed, t.Execute will fail, and there's nothing
|
// If the writer is closed, t.Execute will fail, and there's nothing
|
||||||
|
@ -281,24 +290,20 @@ func printHelp(out io.Writer, templ string, data interface{}) {
|
||||||
|
|
||||||
func checkVersion(c *Context) bool {
|
func checkVersion(c *Context) bool {
|
||||||
found := false
|
found := false
|
||||||
if VersionFlag.GetName() != "" {
|
for _, name := range VersionFlag.Names() {
|
||||||
eachName(VersionFlag.GetName(), func(name string) {
|
if c.Bool(name) {
|
||||||
if c.GlobalBool(name) || c.Bool(name) {
|
found = true
|
||||||
found = true
|
}
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
return found
|
return found
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkHelp(c *Context) bool {
|
func checkHelp(c *Context) bool {
|
||||||
found := false
|
found := false
|
||||||
if HelpFlag.GetName() != "" {
|
for _, name := range HelpFlag.Names() {
|
||||||
eachName(HelpFlag.GetName(), func(name string) {
|
if c.Bool(name) {
|
||||||
if c.GlobalBool(name) || c.Bool(name) {
|
found = true
|
||||||
found = true
|
}
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
return found
|
return found
|
||||||
}
|
}
|
||||||
|
@ -329,7 +334,7 @@ func checkShellCompleteFlag(a *App, arguments []string) (bool, []string) {
|
||||||
pos := len(arguments) - 1
|
pos := len(arguments) - 1
|
||||||
lastArg := arguments[pos]
|
lastArg := arguments[pos]
|
||||||
|
|
||||||
if lastArg != "--"+BashCompletionFlag.GetName() {
|
if lastArg != "--generate-bash-completion" {
|
||||||
return false, arguments
|
return false, arguments
|
||||||
}
|
}
|
||||||
|
|
9
vendor/github.com/urfave/cli/parse.go → vendor/github.com/urfave/cli/v2/parse.go
generated
vendored
9
vendor/github.com/urfave/cli/parse.go → vendor/github.com/urfave/cli/v2/parse.go
generated
vendored
|
@ -11,13 +11,18 @@ type iterativeParser interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
// To enable short-option handling (e.g., "-it" vs "-i -t") we have to
|
// To enable short-option handling (e.g., "-it" vs "-i -t") we have to
|
||||||
// iteratively catch parsing errors. This way we achieve LR parsing without
|
// iteratively catch parsing errors. This way we achieve LR parsing without
|
||||||
// transforming any arguments. Otherwise, there is no way we can discriminate
|
// transforming any arguments. Otherwise, there is no way we can discriminate
|
||||||
// combined short options from common arguments that should be left untouched.
|
// combined short options from common arguments that should be left untouched.
|
||||||
func parseIter(set *flag.FlagSet, ip iterativeParser, args []string) error {
|
// Pass `shellComplete` to continue parsing options on failure during shell
|
||||||
|
// completion when, the user-supplied options may be incomplete.
|
||||||
|
func parseIter(set *flag.FlagSet, ip iterativeParser, args []string, shellComplete bool) error {
|
||||||
for {
|
for {
|
||||||
err := set.Parse(args)
|
err := set.Parse(args)
|
||||||
if !ip.useShortOptionHandling() || err == nil {
|
if !ip.useShortOptionHandling() || err == nil {
|
||||||
|
if shellComplete {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
0
vendor/github.com/urfave/cli/sort.go → vendor/github.com/urfave/cli/v2/sort.go
generated
vendored
0
vendor/github.com/urfave/cli/sort.go → vendor/github.com/urfave/cli/v2/sort.go
generated
vendored
|
@ -20,7 +20,6 @@ AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}:
|
||||||
{{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}}
|
{{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}}
|
||||||
|
|
||||||
COMMANDS:{{range .VisibleCategories}}{{if .Name}}
|
COMMANDS:{{range .VisibleCategories}}{{if .Name}}
|
||||||
|
|
||||||
{{.Name}}:{{range .VisibleCommands}}
|
{{.Name}}:{{range .VisibleCommands}}
|
||||||
{{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{else}}{{range .VisibleCommands}}
|
{{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{else}}{{range .VisibleCommands}}
|
||||||
{{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{end}}{{if .VisibleFlags}}
|
{{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{end}}{{if .VisibleFlags}}
|
||||||
|
@ -63,7 +62,6 @@ USAGE:
|
||||||
{{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} command{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}
|
{{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} command{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}
|
||||||
|
|
||||||
COMMANDS:{{range .VisibleCategories}}{{if .Name}}
|
COMMANDS:{{range .VisibleCategories}}{{if .Name}}
|
||||||
|
|
||||||
{{.Name}}:{{range .VisibleCommands}}
|
{{.Name}}:{{range .VisibleCommands}}
|
||||||
{{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{else}}{{range .VisibleCommands}}
|
{{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{else}}{{range .VisibleCommands}}
|
||||||
{{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{if .VisibleFlags}}
|
{{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{if .VisibleFlags}}
|
||||||
|
@ -73,9 +71,9 @@ OPTIONS:
|
||||||
{{end}}{{end}}
|
{{end}}{{end}}
|
||||||
`
|
`
|
||||||
|
|
||||||
var MarkdownDocTemplate = `% {{ .App.Name }}(8) {{ .App.Description }}
|
var MarkdownDocTemplate = `% {{ .App.Name }}(8){{ if .App.Description }} {{ .App.Description }}{{ end }}
|
||||||
|
{{ range $a := .App.Authors }}
|
||||||
% {{ .App.Author }}
|
% {{ $a }}{{ end }}
|
||||||
|
|
||||||
# NAME
|
# NAME
|
||||||
|
|
8
vendor/golang.org/x/net/http2/client_conn_pool.go
generated
vendored
8
vendor/golang.org/x/net/http2/client_conn_pool.go
generated
vendored
|
@ -107,6 +107,7 @@ func (p *clientConnPool) getClientConn(req *http.Request, addr string, dialOnMis
|
||||||
|
|
||||||
// dialCall is an in-flight Transport dial call to a host.
|
// dialCall is an in-flight Transport dial call to a host.
|
||||||
type dialCall struct {
|
type dialCall struct {
|
||||||
|
_ incomparable
|
||||||
p *clientConnPool
|
p *clientConnPool
|
||||||
done chan struct{} // closed when done
|
done chan struct{} // closed when done
|
||||||
res *ClientConn // valid after done is closed
|
res *ClientConn // valid after done is closed
|
||||||
|
@ -180,6 +181,7 @@ func (p *clientConnPool) addConnIfNeeded(key string, t *Transport, c *tls.Conn)
|
||||||
}
|
}
|
||||||
|
|
||||||
type addConnCall struct {
|
type addConnCall struct {
|
||||||
|
_ incomparable
|
||||||
p *clientConnPool
|
p *clientConnPool
|
||||||
done chan struct{} // closed when done
|
done chan struct{} // closed when done
|
||||||
err error
|
err error
|
||||||
|
@ -200,12 +202,6 @@ func (c *addConnCall) run(t *Transport, key string, tc *tls.Conn) {
|
||||||
close(c.done)
|
close(c.done)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *clientConnPool) addConn(key string, cc *ClientConn) {
|
|
||||||
p.mu.Lock()
|
|
||||||
p.addConnLocked(key, cc)
|
|
||||||
p.mu.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
// p.mu must be held
|
// p.mu must be held
|
||||||
func (p *clientConnPool) addConnLocked(key string, cc *ClientConn) {
|
func (p *clientConnPool) addConnLocked(key string, cc *ClientConn) {
|
||||||
for _, v := range p.conns[key] {
|
for _, v := range p.conns[key] {
|
||||||
|
|
2
vendor/golang.org/x/net/http2/flow.go
generated
vendored
2
vendor/golang.org/x/net/http2/flow.go
generated
vendored
|
@ -8,6 +8,8 @@ package http2
|
||||||
|
|
||||||
// flow is the flow control window's size.
|
// flow is the flow control window's size.
|
||||||
type flow struct {
|
type flow struct {
|
||||||
|
_ incomparable
|
||||||
|
|
||||||
// n is the number of DATA bytes we're allowed to send.
|
// n is the number of DATA bytes we're allowed to send.
|
||||||
// A flow is kept both on a conn and a per-stream.
|
// A flow is kept both on a conn and a per-stream.
|
||||||
n int32
|
n int32
|
||||||
|
|
7
vendor/golang.org/x/net/http2/hpack/huffman.go
generated
vendored
7
vendor/golang.org/x/net/http2/hpack/huffman.go
generated
vendored
|
@ -105,7 +105,14 @@ func huffmanDecode(buf *bytes.Buffer, maxLen int, v []byte) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// incomparable is a zero-width, non-comparable type. Adding it to a struct
|
||||||
|
// makes that struct also non-comparable, and generally doesn't add
|
||||||
|
// any size (as long as it's first).
|
||||||
|
type incomparable [0]func()
|
||||||
|
|
||||||
type node struct {
|
type node struct {
|
||||||
|
_ incomparable
|
||||||
|
|
||||||
// children is non-nil for internal nodes
|
// children is non-nil for internal nodes
|
||||||
children *[256]*node
|
children *[256]*node
|
||||||
|
|
||||||
|
|
7
vendor/golang.org/x/net/http2/http2.go
generated
vendored
7
vendor/golang.org/x/net/http2/http2.go
generated
vendored
|
@ -241,6 +241,7 @@ func (cw closeWaiter) Wait() {
|
||||||
// Its buffered writer is lazily allocated as needed, to minimize
|
// Its buffered writer is lazily allocated as needed, to minimize
|
||||||
// idle memory usage with many connections.
|
// idle memory usage with many connections.
|
||||||
type bufferedWriter struct {
|
type bufferedWriter struct {
|
||||||
|
_ incomparable
|
||||||
w io.Writer // immutable
|
w io.Writer // immutable
|
||||||
bw *bufio.Writer // non-nil when data is buffered
|
bw *bufio.Writer // non-nil when data is buffered
|
||||||
}
|
}
|
||||||
|
@ -313,6 +314,7 @@ func bodyAllowedForStatus(status int) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
type httpError struct {
|
type httpError struct {
|
||||||
|
_ incomparable
|
||||||
msg string
|
msg string
|
||||||
timeout bool
|
timeout bool
|
||||||
}
|
}
|
||||||
|
@ -376,3 +378,8 @@ func (s *sorter) SortStrings(ss []string) {
|
||||||
func validPseudoPath(v string) bool {
|
func validPseudoPath(v string) bool {
|
||||||
return (len(v) > 0 && v[0] == '/') || v == "*"
|
return (len(v) > 0 && v[0] == '/') || v == "*"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// incomparable is a zero-width, non-comparable type. Adding it to a struct
|
||||||
|
// makes that struct also non-comparable, and generally doesn't add
|
||||||
|
// any size (as long as it's first).
|
||||||
|
type incomparable [0]func()
|
||||||
|
|
8
vendor/golang.org/x/net/http2/server.go
generated
vendored
8
vendor/golang.org/x/net/http2/server.go
generated
vendored
|
@ -761,6 +761,7 @@ func (sc *serverConn) readFrames() {
|
||||||
|
|
||||||
// frameWriteResult is the message passed from writeFrameAsync to the serve goroutine.
|
// frameWriteResult is the message passed from writeFrameAsync to the serve goroutine.
|
||||||
type frameWriteResult struct {
|
type frameWriteResult struct {
|
||||||
|
_ incomparable
|
||||||
wr FrameWriteRequest // what was written (or attempted)
|
wr FrameWriteRequest // what was written (or attempted)
|
||||||
err error // result of the writeFrame call
|
err error // result of the writeFrame call
|
||||||
}
|
}
|
||||||
|
@ -771,7 +772,7 @@ type frameWriteResult struct {
|
||||||
// serverConn.
|
// serverConn.
|
||||||
func (sc *serverConn) writeFrameAsync(wr FrameWriteRequest) {
|
func (sc *serverConn) writeFrameAsync(wr FrameWriteRequest) {
|
||||||
err := wr.write.writeFrame(sc)
|
err := wr.write.writeFrame(sc)
|
||||||
sc.wroteFrameCh <- frameWriteResult{wr, err}
|
sc.wroteFrameCh <- frameWriteResult{wr: wr, err: err}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sc *serverConn) closeAllStreamsOnConnClose() {
|
func (sc *serverConn) closeAllStreamsOnConnClose() {
|
||||||
|
@ -1161,7 +1162,7 @@ func (sc *serverConn) startFrameWrite(wr FrameWriteRequest) {
|
||||||
if wr.write.staysWithinBuffer(sc.bw.Available()) {
|
if wr.write.staysWithinBuffer(sc.bw.Available()) {
|
||||||
sc.writingFrameAsync = false
|
sc.writingFrameAsync = false
|
||||||
err := wr.write.writeFrame(sc)
|
err := wr.write.writeFrame(sc)
|
||||||
sc.wroteFrame(frameWriteResult{wr, err})
|
sc.wroteFrame(frameWriteResult{wr: wr, err: err})
|
||||||
} else {
|
} else {
|
||||||
sc.writingFrameAsync = true
|
sc.writingFrameAsync = true
|
||||||
go sc.writeFrameAsync(wr)
|
go sc.writeFrameAsync(wr)
|
||||||
|
@ -2057,7 +2058,7 @@ func (sc *serverConn) newWriterAndRequestNoBody(st *stream, rp requestParam) (*r
|
||||||
var trailer http.Header
|
var trailer http.Header
|
||||||
for _, v := range rp.header["Trailer"] {
|
for _, v := range rp.header["Trailer"] {
|
||||||
for _, key := range strings.Split(v, ",") {
|
for _, key := range strings.Split(v, ",") {
|
||||||
key = http.CanonicalHeaderKey(strings.TrimSpace(key))
|
key = http.CanonicalHeaderKey(textproto.TrimString(key))
|
||||||
switch key {
|
switch key {
|
||||||
case "Transfer-Encoding", "Trailer", "Content-Length":
|
case "Transfer-Encoding", "Trailer", "Content-Length":
|
||||||
// Bogus. (copy of http1 rules)
|
// Bogus. (copy of http1 rules)
|
||||||
|
@ -2275,6 +2276,7 @@ func (sc *serverConn) sendWindowUpdate32(st *stream, n int32) {
|
||||||
// requestBody is the Handler's Request.Body type.
|
// requestBody is the Handler's Request.Body type.
|
||||||
// Read and Close may be called concurrently.
|
// Read and Close may be called concurrently.
|
||||||
type requestBody struct {
|
type requestBody struct {
|
||||||
|
_ incomparable
|
||||||
stream *stream
|
stream *stream
|
||||||
conn *serverConn
|
conn *serverConn
|
||||||
closed bool // for use by Close only
|
closed bool // for use by Close only
|
||||||
|
|
78
vendor/golang.org/x/net/http2/transport.go
generated
vendored
78
vendor/golang.org/x/net/http2/transport.go
generated
vendored
|
@ -108,6 +108,19 @@ type Transport struct {
|
||||||
// waiting for their turn.
|
// waiting for their turn.
|
||||||
StrictMaxConcurrentStreams bool
|
StrictMaxConcurrentStreams bool
|
||||||
|
|
||||||
|
// ReadIdleTimeout is the timeout after which a health check using ping
|
||||||
|
// frame will be carried out if no frame is received on the connection.
|
||||||
|
// Note that a ping response will is considered a received frame, so if
|
||||||
|
// there is no other traffic on the connection, the health check will
|
||||||
|
// be performed every ReadIdleTimeout interval.
|
||||||
|
// If zero, no health check is performed.
|
||||||
|
ReadIdleTimeout time.Duration
|
||||||
|
|
||||||
|
// PingTimeout is the timeout after which the connection will be closed
|
||||||
|
// if a response to Ping is not received.
|
||||||
|
// Defaults to 15s.
|
||||||
|
PingTimeout time.Duration
|
||||||
|
|
||||||
// t1, if non-nil, is the standard library Transport using
|
// t1, if non-nil, is the standard library Transport using
|
||||||
// this transport. Its settings are used (but not its
|
// this transport. Its settings are used (but not its
|
||||||
// RoundTrip method, etc).
|
// RoundTrip method, etc).
|
||||||
|
@ -131,6 +144,14 @@ func (t *Transport) disableCompression() bool {
|
||||||
return t.DisableCompression || (t.t1 != nil && t.t1.DisableCompression)
|
return t.DisableCompression || (t.t1 != nil && t.t1.DisableCompression)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *Transport) pingTimeout() time.Duration {
|
||||||
|
if t.PingTimeout == 0 {
|
||||||
|
return 15 * time.Second
|
||||||
|
}
|
||||||
|
return t.PingTimeout
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2.
|
// ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2.
|
||||||
// It returns an error if t1 has already been HTTP/2-enabled.
|
// It returns an error if t1 has already been HTTP/2-enabled.
|
||||||
func ConfigureTransport(t1 *http.Transport) error {
|
func ConfigureTransport(t1 *http.Transport) error {
|
||||||
|
@ -675,6 +696,20 @@ func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, erro
|
||||||
return cc, nil
|
return cc, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (cc *ClientConn) healthCheck() {
|
||||||
|
pingTimeout := cc.t.pingTimeout()
|
||||||
|
// We don't need to periodically ping in the health check, because the readLoop of ClientConn will
|
||||||
|
// trigger the healthCheck again if there is no frame received.
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), pingTimeout)
|
||||||
|
defer cancel()
|
||||||
|
err := cc.Ping(ctx)
|
||||||
|
if err != nil {
|
||||||
|
cc.closeForLostPing()
|
||||||
|
cc.t.connPool().MarkDead(cc)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (cc *ClientConn) setGoAway(f *GoAwayFrame) {
|
func (cc *ClientConn) setGoAway(f *GoAwayFrame) {
|
||||||
cc.mu.Lock()
|
cc.mu.Lock()
|
||||||
defer cc.mu.Unlock()
|
defer cc.mu.Unlock()
|
||||||
|
@ -846,14 +881,12 @@ func (cc *ClientConn) sendGoAway() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close closes the client connection immediately.
|
// closes the client connection immediately. In-flight requests are interrupted.
|
||||||
//
|
// err is sent to streams.
|
||||||
// In-flight requests are interrupted. For a graceful shutdown, use Shutdown instead.
|
func (cc *ClientConn) closeForError(err error) error {
|
||||||
func (cc *ClientConn) Close() error {
|
|
||||||
cc.mu.Lock()
|
cc.mu.Lock()
|
||||||
defer cc.cond.Broadcast()
|
defer cc.cond.Broadcast()
|
||||||
defer cc.mu.Unlock()
|
defer cc.mu.Unlock()
|
||||||
err := errors.New("http2: client connection force closed via ClientConn.Close")
|
|
||||||
for id, cs := range cc.streams {
|
for id, cs := range cc.streams {
|
||||||
select {
|
select {
|
||||||
case cs.resc <- resAndError{err: err}:
|
case cs.resc <- resAndError{err: err}:
|
||||||
|
@ -866,6 +899,20 @@ func (cc *ClientConn) Close() error {
|
||||||
return cc.tconn.Close()
|
return cc.tconn.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close closes the client connection immediately.
|
||||||
|
//
|
||||||
|
// In-flight requests are interrupted. For a graceful shutdown, use Shutdown instead.
|
||||||
|
func (cc *ClientConn) Close() error {
|
||||||
|
err := errors.New("http2: client connection force closed via ClientConn.Close")
|
||||||
|
return cc.closeForError(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// closes the client connection immediately. In-flight requests are interrupted.
|
||||||
|
func (cc *ClientConn) closeForLostPing() error {
|
||||||
|
err := errors.New("http2: client connection lost")
|
||||||
|
return cc.closeForError(err)
|
||||||
|
}
|
||||||
|
|
||||||
const maxAllocFrameSize = 512 << 10
|
const maxAllocFrameSize = 512 << 10
|
||||||
|
|
||||||
// frameBuffer returns a scratch buffer suitable for writing DATA frames.
|
// frameBuffer returns a scratch buffer suitable for writing DATA frames.
|
||||||
|
@ -916,7 +963,7 @@ func commaSeparatedTrailers(req *http.Request) (string, error) {
|
||||||
k = http.CanonicalHeaderKey(k)
|
k = http.CanonicalHeaderKey(k)
|
||||||
switch k {
|
switch k {
|
||||||
case "Transfer-Encoding", "Trailer", "Content-Length":
|
case "Transfer-Encoding", "Trailer", "Content-Length":
|
||||||
return "", &badStringError{"invalid Trailer key", k}
|
return "", fmt.Errorf("invalid Trailer key %q", k)
|
||||||
}
|
}
|
||||||
keys = append(keys, k)
|
keys = append(keys, k)
|
||||||
}
|
}
|
||||||
|
@ -1394,13 +1441,6 @@ func (cs *clientStream) awaitFlowControl(maxBytes int) (taken int32, err error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type badStringError struct {
|
|
||||||
what string
|
|
||||||
str string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *badStringError) Error() string { return fmt.Sprintf("%s %q", e.what, e.str) }
|
|
||||||
|
|
||||||
// requires cc.mu be held.
|
// requires cc.mu be held.
|
||||||
func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trailers string, contentLength int64) ([]byte, error) {
|
func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trailers string, contentLength int64) ([]byte, error) {
|
||||||
cc.hbuf.Reset()
|
cc.hbuf.Reset()
|
||||||
|
@ -1616,6 +1656,7 @@ func (cc *ClientConn) writeHeader(name, value string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
type resAndError struct {
|
type resAndError struct {
|
||||||
|
_ incomparable
|
||||||
res *http.Response
|
res *http.Response
|
||||||
err error
|
err error
|
||||||
}
|
}
|
||||||
|
@ -1663,6 +1704,7 @@ func (cc *ClientConn) streamByID(id uint32, andRemove bool) *clientStream {
|
||||||
|
|
||||||
// clientConnReadLoop is the state owned by the clientConn's frame-reading readLoop.
|
// clientConnReadLoop is the state owned by the clientConn's frame-reading readLoop.
|
||||||
type clientConnReadLoop struct {
|
type clientConnReadLoop struct {
|
||||||
|
_ incomparable
|
||||||
cc *ClientConn
|
cc *ClientConn
|
||||||
closeWhenIdle bool
|
closeWhenIdle bool
|
||||||
}
|
}
|
||||||
|
@ -1742,8 +1784,17 @@ func (rl *clientConnReadLoop) run() error {
|
||||||
rl.closeWhenIdle = cc.t.disableKeepAlives() || cc.singleUse
|
rl.closeWhenIdle = cc.t.disableKeepAlives() || cc.singleUse
|
||||||
gotReply := false // ever saw a HEADERS reply
|
gotReply := false // ever saw a HEADERS reply
|
||||||
gotSettings := false
|
gotSettings := false
|
||||||
|
readIdleTimeout := cc.t.ReadIdleTimeout
|
||||||
|
var t *time.Timer
|
||||||
|
if readIdleTimeout != 0 {
|
||||||
|
t = time.AfterFunc(readIdleTimeout, cc.healthCheck)
|
||||||
|
defer t.Stop()
|
||||||
|
}
|
||||||
for {
|
for {
|
||||||
f, err := cc.fr.ReadFrame()
|
f, err := cc.fr.ReadFrame()
|
||||||
|
if t != nil {
|
||||||
|
t.Reset(readIdleTimeout)
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
cc.vlogf("http2: Transport readFrame error on conn %p: (%T) %v", cc, err, err)
|
cc.vlogf("http2: Transport readFrame error on conn %p: (%T) %v", cc, err, err)
|
||||||
}
|
}
|
||||||
|
@ -2479,6 +2530,7 @@ func (rt erringRoundTripper) RoundTrip(*http.Request) (*http.Response, error) {
|
||||||
// gzipReader wraps a response body so it can lazily
|
// gzipReader wraps a response body so it can lazily
|
||||||
// call gzip.NewReader on the first call to Read
|
// call gzip.NewReader on the first call to Read
|
||||||
type gzipReader struct {
|
type gzipReader struct {
|
||||||
|
_ incomparable
|
||||||
body io.ReadCloser // underlying Response.Body
|
body io.ReadCloser // underlying Response.Body
|
||||||
zr *gzip.Reader // lazily-initialized gzip reader
|
zr *gzip.Reader // lazily-initialized gzip reader
|
||||||
zerr error // sticky error
|
zerr error // sticky error
|
||||||
|
|
9
vendor/golang.org/x/tools/go/analysis/doc.go
generated
vendored
9
vendor/golang.org/x/tools/go/analysis/doc.go
generated
vendored
|
@ -170,6 +170,15 @@ Diagnostic is defined as:
|
||||||
The optional Category field is a short identifier that classifies the
|
The optional Category field is a short identifier that classifies the
|
||||||
kind of message when an analysis produces several kinds of diagnostic.
|
kind of message when an analysis produces several kinds of diagnostic.
|
||||||
|
|
||||||
|
Many analyses want to associate diagnostics with a severity level.
|
||||||
|
Because Diagnostic does not have a severity level field, an Analyzer's
|
||||||
|
diagnostics effectively all have the same severity level. To separate which
|
||||||
|
diagnostics are high severity and which are low severity, expose multiple
|
||||||
|
Analyzers instead. Analyzers should also be separated when their
|
||||||
|
diagnostics belong in different groups, or could be tagged differently
|
||||||
|
before being shown to the end user. Analyzers should document their severity
|
||||||
|
level to help downstream tools surface diagnostics properly.
|
||||||
|
|
||||||
Most Analyzers inspect typed Go syntax trees, but a few, such as asmdecl
|
Most Analyzers inspect typed Go syntax trees, but a few, such as asmdecl
|
||||||
and buildtag, inspect the raw text of Go source files or even non-Go
|
and buildtag, inspect the raw text of Go source files or even non-Go
|
||||||
files such as assembly. To report a diagnostic against a line of a
|
files such as assembly. To report a diagnostic against a line of a
|
||||||
|
|
24
vendor/golang.org/x/tools/go/packages/golist.go
generated
vendored
24
vendor/golang.org/x/tools/go/packages/golist.go
generated
vendored
|
@ -24,7 +24,6 @@ import (
|
||||||
|
|
||||||
"golang.org/x/tools/go/internal/packagesdriver"
|
"golang.org/x/tools/go/internal/packagesdriver"
|
||||||
"golang.org/x/tools/internal/gocommand"
|
"golang.org/x/tools/internal/gocommand"
|
||||||
"golang.org/x/tools/internal/packagesinternal"
|
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -382,7 +381,7 @@ type jsonPackage struct {
|
||||||
Imports []string
|
Imports []string
|
||||||
ImportMap map[string]string
|
ImportMap map[string]string
|
||||||
Deps []string
|
Deps []string
|
||||||
Module *packagesinternal.Module
|
Module *Module
|
||||||
TestGoFiles []string
|
TestGoFiles []string
|
||||||
TestImports []string
|
TestImports []string
|
||||||
XTestGoFiles []string
|
XTestGoFiles []string
|
||||||
|
@ -541,7 +540,26 @@ func (state *golistState) createDriverResponse(words ...string) (*driverResponse
|
||||||
CompiledGoFiles: absJoin(p.Dir, p.CompiledGoFiles),
|
CompiledGoFiles: absJoin(p.Dir, p.CompiledGoFiles),
|
||||||
OtherFiles: absJoin(p.Dir, otherFiles(p)...),
|
OtherFiles: absJoin(p.Dir, otherFiles(p)...),
|
||||||
forTest: p.ForTest,
|
forTest: p.ForTest,
|
||||||
module: p.Module,
|
Module: p.Module,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.cfg.Mode&typecheckCgo) != 0 && len(p.CgoFiles) != 0 {
|
||||||
|
if len(p.CompiledGoFiles) > len(p.GoFiles) {
|
||||||
|
// We need the cgo definitions, which are in the first
|
||||||
|
// CompiledGoFile after the non-cgo ones. This is a hack but there
|
||||||
|
// isn't currently a better way to find it. We also need the pure
|
||||||
|
// Go files and unprocessed cgo files, all of which are already
|
||||||
|
// in pkg.GoFiles.
|
||||||
|
cgoTypes := p.CompiledGoFiles[len(p.GoFiles)]
|
||||||
|
pkg.CompiledGoFiles = append([]string{cgoTypes}, pkg.GoFiles...)
|
||||||
|
} else {
|
||||||
|
// golang/go#38990: go list silently fails to do cgo processing
|
||||||
|
pkg.CompiledGoFiles = nil
|
||||||
|
pkg.Errors = append(pkg.Errors, Error{
|
||||||
|
Msg: "go list failed to return CompiledGoFiles; https://golang.org/issue/38990?",
|
||||||
|
Kind: ListError,
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Work around https://golang.org/issue/28749:
|
// Work around https://golang.org/issue/28749:
|
||||||
|
|
77
vendor/golang.org/x/tools/go/packages/golist_overlay.go
generated
vendored
77
vendor/golang.org/x/tools/go/packages/golist_overlay.go
generated
vendored
|
@ -5,6 +5,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"go/parser"
|
"go/parser"
|
||||||
"go/token"
|
"go/token"
|
||||||
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sort"
|
"sort"
|
||||||
|
@ -22,10 +23,15 @@ func (state *golistState) processGolistOverlay(response *responseDeduper) (modif
|
||||||
needPkgsSet := make(map[string]bool)
|
needPkgsSet := make(map[string]bool)
|
||||||
modifiedPkgsSet := make(map[string]bool)
|
modifiedPkgsSet := make(map[string]bool)
|
||||||
|
|
||||||
|
pkgOfDir := make(map[string][]*Package)
|
||||||
for _, pkg := range response.dr.Packages {
|
for _, pkg := range response.dr.Packages {
|
||||||
// This is an approximation of import path to id. This can be
|
// This is an approximation of import path to id. This can be
|
||||||
// wrong for tests, vendored packages, and a number of other cases.
|
// wrong for tests, vendored packages, and a number of other cases.
|
||||||
havePkgs[pkg.PkgPath] = pkg.ID
|
havePkgs[pkg.PkgPath] = pkg.ID
|
||||||
|
x := commonDir(pkg.GoFiles)
|
||||||
|
if x != "" {
|
||||||
|
pkgOfDir[x] = append(pkgOfDir[x], pkg)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If no new imports are added, it is safe to avoid loading any needPkgs.
|
// If no new imports are added, it is safe to avoid loading any needPkgs.
|
||||||
|
@ -64,6 +70,9 @@ func (state *golistState) processGolistOverlay(response *responseDeduper) (modif
|
||||||
// to the overlay.
|
// to the overlay.
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
// If all the overlay files belong to a different package, change the
|
||||||
|
// package name to that package.
|
||||||
|
maybeFixPackageName(pkgName, isTestFile, pkgOfDir[dir])
|
||||||
nextPackage:
|
nextPackage:
|
||||||
for _, p := range response.dr.Packages {
|
for _, p := range response.dr.Packages {
|
||||||
if pkgName != p.Name && p.ID != "command-line-arguments" {
|
if pkgName != p.Name && p.ID != "command-line-arguments" {
|
||||||
|
@ -112,16 +121,21 @@ func (state *golistState) processGolistOverlay(response *responseDeduper) (modif
|
||||||
if isTestFile && !isXTest {
|
if isTestFile && !isXTest {
|
||||||
id = fmt.Sprintf("%s [%s.test]", pkgPath, pkgPath)
|
id = fmt.Sprintf("%s [%s.test]", pkgPath, pkgPath)
|
||||||
}
|
}
|
||||||
// Try to reclaim a package with the same id if it exists in the response.
|
// Try to reclaim a package with the same ID, if it exists in the response.
|
||||||
for _, p := range response.dr.Packages {
|
for _, p := range response.dr.Packages {
|
||||||
if reclaimPackage(p, id, opath, contents) {
|
if reclaimPackage(p, id, opath, contents) {
|
||||||
pkg = p
|
pkg = p
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Otherwise, create a new package
|
// Otherwise, create a new package.
|
||||||
if pkg == nil {
|
if pkg == nil {
|
||||||
pkg = &Package{PkgPath: pkgPath, ID: id, Name: pkgName, Imports: make(map[string]*Package)}
|
pkg = &Package{
|
||||||
|
PkgPath: pkgPath,
|
||||||
|
ID: id,
|
||||||
|
Name: pkgName,
|
||||||
|
Imports: make(map[string]*Package),
|
||||||
|
}
|
||||||
response.addPackage(pkg)
|
response.addPackage(pkg)
|
||||||
havePkgs[pkg.PkgPath] = id
|
havePkgs[pkg.PkgPath] = id
|
||||||
// Add the production package's sources for a test variant.
|
// Add the production package's sources for a test variant.
|
||||||
|
@ -134,6 +148,7 @@ func (state *golistState) processGolistOverlay(response *responseDeduper) (modif
|
||||||
pkg.Imports[k] = &Package{ID: v.ID}
|
pkg.Imports[k] = &Package{ID: v.ID}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// TODO(rstambler): Handle forTest for x_tests.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !fileExists {
|
if !fileExists {
|
||||||
|
@ -149,6 +164,8 @@ func (state *golistState) processGolistOverlay(response *responseDeduper) (modif
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
for _, imp := range imports {
|
for _, imp := range imports {
|
||||||
|
// TODO(rstambler): If the package is an x test and the import has
|
||||||
|
// a test variant, make sure to replace it.
|
||||||
if _, found := pkg.Imports[imp]; found {
|
if _, found := pkg.Imports[imp]; found {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -384,3 +401,57 @@ func extractPackageName(filename string, contents []byte) (string, bool) {
|
||||||
}
|
}
|
||||||
return f.Name.Name, true
|
return f.Name.Name, true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func commonDir(a []string) string {
|
||||||
|
seen := make(map[string]bool)
|
||||||
|
x := append([]string{}, a...)
|
||||||
|
for _, f := range x {
|
||||||
|
seen[filepath.Dir(f)] = true
|
||||||
|
}
|
||||||
|
if len(seen) > 1 {
|
||||||
|
log.Fatalf("commonDir saw %v for %v", seen, x)
|
||||||
|
}
|
||||||
|
for k := range seen {
|
||||||
|
// len(seen) == 1
|
||||||
|
return k
|
||||||
|
}
|
||||||
|
return "" // no files
|
||||||
|
}
|
||||||
|
|
||||||
|
// It is possible that the files in the disk directory dir have a different package
|
||||||
|
// name from newName, which is deduced from the overlays. If they all have a different
|
||||||
|
// package name, and they all have the same package name, then that name becomes
|
||||||
|
// the package name.
|
||||||
|
// It returns true if it changes the package name, false otherwise.
|
||||||
|
func maybeFixPackageName(newName string, isTestFile bool, pkgsOfDir []*Package) {
|
||||||
|
names := make(map[string]int)
|
||||||
|
for _, p := range pkgsOfDir {
|
||||||
|
names[p.Name]++
|
||||||
|
}
|
||||||
|
if len(names) != 1 {
|
||||||
|
// some files are in different packages
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var oldName string
|
||||||
|
for k := range names {
|
||||||
|
oldName = k
|
||||||
|
}
|
||||||
|
if newName == oldName {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// We might have a case where all of the package names in the directory are
|
||||||
|
// the same, but the overlay file is for an x test, which belongs to its
|
||||||
|
// own package. If the x test does not yet exist on disk, we may not yet
|
||||||
|
// have its package name on disk, but we should not rename the packages.
|
||||||
|
//
|
||||||
|
// We use a heuristic to determine if this file belongs to an x test:
|
||||||
|
// The test file should have a package name whose package name has a _test
|
||||||
|
// suffix or looks like "newName_test".
|
||||||
|
maybeXTest := strings.HasPrefix(oldName+"_test", newName) || strings.HasSuffix(newName, "_test")
|
||||||
|
if isTestFile && maybeXTest {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, p := range pkgsOfDir {
|
||||||
|
p.Name = newName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
69
vendor/golang.org/x/tools/go/packages/packages.go
generated
vendored
69
vendor/golang.org/x/tools/go/packages/packages.go
generated
vendored
|
@ -21,10 +21,12 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"golang.org/x/tools/go/gcexportdata"
|
"golang.org/x/tools/go/gcexportdata"
|
||||||
"golang.org/x/tools/internal/gocommand"
|
"golang.org/x/tools/internal/gocommand"
|
||||||
"golang.org/x/tools/internal/packagesinternal"
|
"golang.org/x/tools/internal/packagesinternal"
|
||||||
|
"golang.org/x/tools/internal/typesinternal"
|
||||||
)
|
)
|
||||||
|
|
||||||
// A LoadMode controls the amount of detail to return when loading.
|
// A LoadMode controls the amount of detail to return when loading.
|
||||||
|
@ -70,6 +72,13 @@ const (
|
||||||
|
|
||||||
// NeedTypesSizes adds TypesSizes.
|
// NeedTypesSizes adds TypesSizes.
|
||||||
NeedTypesSizes
|
NeedTypesSizes
|
||||||
|
|
||||||
|
// typecheckCgo enables full support for type checking cgo. Requires Go 1.15+.
|
||||||
|
// Modifies CompiledGoFiles and Types, and has no effect on its own.
|
||||||
|
typecheckCgo
|
||||||
|
|
||||||
|
// NeedModule adds Module.
|
||||||
|
NeedModule
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -182,6 +191,13 @@ type driver func(cfg *Config, patterns ...string) (*driverResponse, error)
|
||||||
|
|
||||||
// driverResponse contains the results for a driver query.
|
// driverResponse contains the results for a driver query.
|
||||||
type driverResponse struct {
|
type driverResponse struct {
|
||||||
|
// NotHandled is returned if the request can't be handled by the current
|
||||||
|
// driver. If an external driver returns a response with NotHandled, the
|
||||||
|
// rest of the driverResponse is ignored, and go/packages will fallback
|
||||||
|
// to the next driver. If go/packages is extended in the future to support
|
||||||
|
// lists of multiple drivers, go/packages will fall back to the next driver.
|
||||||
|
NotHandled bool
|
||||||
|
|
||||||
// Sizes, if not nil, is the types.Sizes to use when type checking.
|
// Sizes, if not nil, is the types.Sizes to use when type checking.
|
||||||
Sizes *types.StdSizes
|
Sizes *types.StdSizes
|
||||||
|
|
||||||
|
@ -223,14 +239,22 @@ func Load(cfg *Config, patterns ...string) ([]*Package, error) {
|
||||||
return l.refine(response.Roots, response.Packages...)
|
return l.refine(response.Roots, response.Packages...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// defaultDriver is a driver that looks for an external driver binary, and if
|
// defaultDriver is a driver that implements go/packages' fallback behavior.
|
||||||
// it does not find it falls back to the built in go list driver.
|
// It will try to request to an external driver, if one exists. If there's
|
||||||
|
// no external driver, or the driver returns a response with NotHandled set,
|
||||||
|
// defaultDriver will fall back to the go list driver.
|
||||||
func defaultDriver(cfg *Config, patterns ...string) (*driverResponse, error) {
|
func defaultDriver(cfg *Config, patterns ...string) (*driverResponse, error) {
|
||||||
driver := findExternalDriver(cfg)
|
driver := findExternalDriver(cfg)
|
||||||
if driver == nil {
|
if driver == nil {
|
||||||
driver = goListDriver
|
driver = goListDriver
|
||||||
}
|
}
|
||||||
return driver(cfg, patterns...)
|
response, err := driver(cfg, patterns...)
|
||||||
|
if err != nil {
|
||||||
|
return response, err
|
||||||
|
} else if response.NotHandled {
|
||||||
|
return goListDriver(cfg, patterns...)
|
||||||
|
}
|
||||||
|
return response, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// A Package describes a loaded Go package.
|
// A Package describes a loaded Go package.
|
||||||
|
@ -257,7 +281,7 @@ type Package struct {
|
||||||
GoFiles []string
|
GoFiles []string
|
||||||
|
|
||||||
// CompiledGoFiles lists the absolute file paths of the package's source
|
// CompiledGoFiles lists the absolute file paths of the package's source
|
||||||
// files that were presented to the compiler.
|
// files that are suitable for type checking.
|
||||||
// This may differ from GoFiles if files are processed before compilation.
|
// This may differ from GoFiles if files are processed before compilation.
|
||||||
CompiledGoFiles []string
|
CompiledGoFiles []string
|
||||||
|
|
||||||
|
@ -305,22 +329,39 @@ type Package struct {
|
||||||
forTest string
|
forTest string
|
||||||
|
|
||||||
// module is the module information for the package if it exists.
|
// module is the module information for the package if it exists.
|
||||||
module *packagesinternal.Module
|
Module *Module
|
||||||
|
}
|
||||||
|
|
||||||
|
// Module provides module information for a package.
|
||||||
|
type Module struct {
|
||||||
|
Path string // module path
|
||||||
|
Version string // module version
|
||||||
|
Replace *Module // replaced by this module
|
||||||
|
Time *time.Time // time version was created
|
||||||
|
Main bool // is this the main module?
|
||||||
|
Indirect bool // is this module only an indirect dependency of main module?
|
||||||
|
Dir string // directory holding files for this module, if any
|
||||||
|
GoMod string // path to go.mod file used when loading this module, if any
|
||||||
|
GoVersion string // go version used in module
|
||||||
|
Error *ModuleError // error loading module
|
||||||
|
}
|
||||||
|
|
||||||
|
// ModuleError holds errors loading a module.
|
||||||
|
type ModuleError struct {
|
||||||
|
Err string // the error itself
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
packagesinternal.GetForTest = func(p interface{}) string {
|
packagesinternal.GetForTest = func(p interface{}) string {
|
||||||
return p.(*Package).forTest
|
return p.(*Package).forTest
|
||||||
}
|
}
|
||||||
packagesinternal.GetModule = func(p interface{}) *packagesinternal.Module {
|
|
||||||
return p.(*Package).module
|
|
||||||
}
|
|
||||||
packagesinternal.GetGoCmdRunner = func(config interface{}) *gocommand.Runner {
|
packagesinternal.GetGoCmdRunner = func(config interface{}) *gocommand.Runner {
|
||||||
return config.(*Config).gocmdRunner
|
return config.(*Config).gocmdRunner
|
||||||
}
|
}
|
||||||
packagesinternal.SetGoCmdRunner = func(config interface{}, runner *gocommand.Runner) {
|
packagesinternal.SetGoCmdRunner = func(config interface{}, runner *gocommand.Runner) {
|
||||||
config.(*Config).gocmdRunner = runner
|
config.(*Config).gocmdRunner = runner
|
||||||
}
|
}
|
||||||
|
packagesinternal.TypecheckCgo = int(typecheckCgo)
|
||||||
}
|
}
|
||||||
|
|
||||||
// An Error describes a problem with a package's metadata, syntax, or types.
|
// An Error describes a problem with a package's metadata, syntax, or types.
|
||||||
|
@ -703,6 +744,9 @@ func (ld *loader) refine(roots []string, list ...*Package) ([]*Package, error) {
|
||||||
if ld.requestedMode&NeedTypesSizes == 0 {
|
if ld.requestedMode&NeedTypesSizes == 0 {
|
||||||
ld.pkgs[i].TypesSizes = nil
|
ld.pkgs[i].TypesSizes = nil
|
||||||
}
|
}
|
||||||
|
if ld.requestedMode&NeedModule == 0 {
|
||||||
|
ld.pkgs[i].Module = nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return result, nil
|
return result, nil
|
||||||
|
@ -878,6 +922,15 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) {
|
||||||
Error: appendError,
|
Error: appendError,
|
||||||
Sizes: ld.sizes,
|
Sizes: ld.sizes,
|
||||||
}
|
}
|
||||||
|
if (ld.Mode & typecheckCgo) != 0 {
|
||||||
|
if !typesinternal.SetUsesCgo(tc) {
|
||||||
|
appendError(Error{
|
||||||
|
Msg: "typecheckCgo requires Go 1.15+",
|
||||||
|
Kind: ListError,
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
types.NewChecker(tc, ld.Fset, lpkg.Types, lpkg.TypesInfo).Files(lpkg.Syntax)
|
types.NewChecker(tc, ld.Fset, lpkg.Types, lpkg.TypesInfo).Files(lpkg.Syntax)
|
||||||
|
|
||||||
lpkg.importErrors = nil // no longer needed
|
lpkg.importErrors = nil // no longer needed
|
||||||
|
|
5
vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
generated
vendored
5
vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
generated
vendored
|
@ -226,7 +226,8 @@ func For(obj types.Object) (Path, error) {
|
||||||
// the best paths because non-types may
|
// the best paths because non-types may
|
||||||
// refer to types, but not the reverse.
|
// refer to types, but not the reverse.
|
||||||
empty := make([]byte, 0, 48) // initial space
|
empty := make([]byte, 0, 48) // initial space
|
||||||
for _, name := range scope.Names() {
|
names := scope.Names()
|
||||||
|
for _, name := range names {
|
||||||
o := scope.Lookup(name)
|
o := scope.Lookup(name)
|
||||||
tname, ok := o.(*types.TypeName)
|
tname, ok := o.(*types.TypeName)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@ -253,7 +254,7 @@ func For(obj types.Object) (Path, error) {
|
||||||
|
|
||||||
// Then inspect everything else:
|
// Then inspect everything else:
|
||||||
// non-types, and declared methods of defined types.
|
// non-types, and declared methods of defined types.
|
||||||
for _, name := range scope.Names() {
|
for _, name := range names {
|
||||||
o := scope.Lookup(name)
|
o := scope.Lookup(name)
|
||||||
path := append(empty, name...)
|
path := append(empty, name...)
|
||||||
if _, ok := o.(*types.TypeName); !ok {
|
if _, ok := o.(*types.TypeName); !ok {
|
||||||
|
|
85
vendor/golang.org/x/tools/internal/event/core/event.go
generated
vendored
Normal file
85
vendor/golang.org/x/tools/internal/event/core/event.go
generated
vendored
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Package core provides support for event based telemetry.
|
||||||
|
package core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"golang.org/x/tools/internal/event/label"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Event holds the information about an event of note that ocurred.
|
||||||
|
type Event struct {
|
||||||
|
at time.Time
|
||||||
|
|
||||||
|
// As events are often on the stack, storing the first few labels directly
|
||||||
|
// in the event can avoid an allocation at all for the very common cases of
|
||||||
|
// simple events.
|
||||||
|
// The length needs to be large enough to cope with the majority of events
|
||||||
|
// but no so large as to cause undue stack pressure.
|
||||||
|
// A log message with two values will use 3 labels (one for each value and
|
||||||
|
// one for the message itself).
|
||||||
|
|
||||||
|
static [3]label.Label // inline storage for the first few labels
|
||||||
|
dynamic []label.Label // dynamically sized storage for remaining labels
|
||||||
|
}
|
||||||
|
|
||||||
|
// eventLabelMap implements label.Map for a the labels of an Event.
|
||||||
|
type eventLabelMap struct {
|
||||||
|
event Event
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ev Event) At() time.Time { return ev.at }
|
||||||
|
|
||||||
|
func (ev Event) Format(f fmt.State, r rune) {
|
||||||
|
if !ev.at.IsZero() {
|
||||||
|
fmt.Fprint(f, ev.at.Format("2006/01/02 15:04:05 "))
|
||||||
|
}
|
||||||
|
for index := 0; ev.Valid(index); index++ {
|
||||||
|
if l := ev.Label(index); l.Valid() {
|
||||||
|
fmt.Fprintf(f, "\n\t%v", l)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ev Event) Valid(index int) bool {
|
||||||
|
return index >= 0 && index < len(ev.static)+len(ev.dynamic)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ev Event) Label(index int) label.Label {
|
||||||
|
if index < len(ev.static) {
|
||||||
|
return ev.static[index]
|
||||||
|
}
|
||||||
|
return ev.dynamic[index-len(ev.static)]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ev Event) Find(key label.Key) label.Label {
|
||||||
|
for _, l := range ev.static {
|
||||||
|
if l.Key() == key {
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, l := range ev.dynamic {
|
||||||
|
if l.Key() == key {
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return label.Label{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeEvent(static [3]label.Label, labels []label.Label) Event {
|
||||||
|
return Event{
|
||||||
|
static: static,
|
||||||
|
dynamic: labels,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CloneEvent event returns a copy of the event with the time adjusted to at.
|
||||||
|
func CloneEvent(ev Event, at time.Time) Event {
|
||||||
|
ev.at = at
|
||||||
|
return ev
|
||||||
|
}
|
|
@ -2,18 +2,20 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package event
|
package core
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
"golang.org/x/tools/internal/event/label"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Exporter is a function that handles events.
|
// Exporter is a function that handles events.
|
||||||
// It may return a modified context and event.
|
// It may return a modified context and event.
|
||||||
type Exporter func(context.Context, Event, TagMap) context.Context
|
type Exporter func(context.Context, Event, label.Map) context.Context
|
||||||
|
|
||||||
var (
|
var (
|
||||||
exporter unsafe.Pointer
|
exporter unsafe.Pointer
|
||||||
|
@ -35,16 +37,16 @@ func SetExporter(e Exporter) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// deliver is called to deliver an event to the supplied exporter.
|
// deliver is called to deliver an event to the supplied exporter.
|
||||||
// it will fill in the time and generate the basic tag source.
|
// it will fill in the time.
|
||||||
func deliver(ctx context.Context, exporter Exporter, ev Event) context.Context {
|
func deliver(ctx context.Context, exporter Exporter, ev Event) context.Context {
|
||||||
// add the current time to the event
|
// add the current time to the event
|
||||||
ev.At = time.Now()
|
ev.at = time.Now()
|
||||||
// hand the event off to the current exporter
|
// hand the event off to the current exporter
|
||||||
return exporter(ctx, ev, ev)
|
return exporter(ctx, ev, ev)
|
||||||
}
|
}
|
||||||
|
|
||||||
// dispatch is called to deliver an event to the global exporter if set.
|
// Export is called to deliver an event to the global exporter if set.
|
||||||
func dispatch(ctx context.Context, ev Event) context.Context {
|
func Export(ctx context.Context, ev Event) context.Context {
|
||||||
// get the global exporter and abort early if there is not one
|
// get the global exporter and abort early if there is not one
|
||||||
exporterPtr := (*Exporter)(atomic.LoadPointer(&exporter))
|
exporterPtr := (*Exporter)(atomic.LoadPointer(&exporter))
|
||||||
if exporterPtr == nil {
|
if exporterPtr == nil {
|
||||||
|
@ -53,11 +55,11 @@ func dispatch(ctx context.Context, ev Event) context.Context {
|
||||||
return deliver(ctx, *exporterPtr, ev)
|
return deliver(ctx, *exporterPtr, ev)
|
||||||
}
|
}
|
||||||
|
|
||||||
// dispatchPair is called to deliver a start event to the supplied exporter.
|
// ExportPair is called to deliver a start event to the supplied exporter.
|
||||||
// It also returns a function that will deliver the end event to the same
|
// It also returns a function that will deliver the end event to the same
|
||||||
// exporter.
|
// exporter.
|
||||||
// it will fill in the time and generate the basic tag source.
|
// It will fill in the time.
|
||||||
func dispatchPair(ctx context.Context, begin, end Event) (context.Context, func()) {
|
func ExportPair(ctx context.Context, begin, end Event) (context.Context, func()) {
|
||||||
// get the global exporter and abort early if there is not one
|
// get the global exporter and abort early if there is not one
|
||||||
exporterPtr := (*Exporter)(atomic.LoadPointer(&exporter))
|
exporterPtr := (*Exporter)(atomic.LoadPointer(&exporter))
|
||||||
if exporterPtr == nil {
|
if exporterPtr == nil {
|
77
vendor/golang.org/x/tools/internal/event/core/fast.go
generated
vendored
Normal file
77
vendor/golang.org/x/tools/internal/event/core/fast.go
generated
vendored
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"golang.org/x/tools/internal/event/keys"
|
||||||
|
"golang.org/x/tools/internal/event/label"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Log1 takes a message and one label delivers a log event to the exporter.
|
||||||
|
// It is a customized version of Print that is faster and does no allocation.
|
||||||
|
func Log1(ctx context.Context, message string, t1 label.Label) {
|
||||||
|
Export(ctx, MakeEvent([3]label.Label{
|
||||||
|
keys.Msg.Of(message),
|
||||||
|
t1,
|
||||||
|
}, nil))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Log2 takes a message and two labels and delivers a log event to the exporter.
|
||||||
|
// It is a customized version of Print that is faster and does no allocation.
|
||||||
|
func Log2(ctx context.Context, message string, t1 label.Label, t2 label.Label) {
|
||||||
|
Export(ctx, MakeEvent([3]label.Label{
|
||||||
|
keys.Msg.Of(message),
|
||||||
|
t1,
|
||||||
|
t2,
|
||||||
|
}, nil))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Metric1 sends a label event to the exporter with the supplied labels.
|
||||||
|
func Metric1(ctx context.Context, t1 label.Label) context.Context {
|
||||||
|
return Export(ctx, MakeEvent([3]label.Label{
|
||||||
|
keys.Metric.New(),
|
||||||
|
t1,
|
||||||
|
}, nil))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Metric2 sends a label event to the exporter with the supplied labels.
|
||||||
|
func Metric2(ctx context.Context, t1, t2 label.Label) context.Context {
|
||||||
|
return Export(ctx, MakeEvent([3]label.Label{
|
||||||
|
keys.Metric.New(),
|
||||||
|
t1,
|
||||||
|
t2,
|
||||||
|
}, nil))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start1 sends a span start event with the supplied label list to the exporter.
|
||||||
|
// It also returns a function that will end the span, which should normally be
|
||||||
|
// deferred.
|
||||||
|
func Start1(ctx context.Context, name string, t1 label.Label) (context.Context, func()) {
|
||||||
|
return ExportPair(ctx,
|
||||||
|
MakeEvent([3]label.Label{
|
||||||
|
keys.Start.Of(name),
|
||||||
|
t1,
|
||||||
|
}, nil),
|
||||||
|
MakeEvent([3]label.Label{
|
||||||
|
keys.End.New(),
|
||||||
|
}, nil))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start2 sends a span start event with the supplied label list to the exporter.
|
||||||
|
// It also returns a function that will end the span, which should normally be
|
||||||
|
// deferred.
|
||||||
|
func Start2(ctx context.Context, name string, t1, t2 label.Label) (context.Context, func()) {
|
||||||
|
return ExportPair(ctx,
|
||||||
|
MakeEvent([3]label.Label{
|
||||||
|
keys.Start.Of(name),
|
||||||
|
t1,
|
||||||
|
t2,
|
||||||
|
}, nil),
|
||||||
|
MakeEvent([3]label.Label{
|
||||||
|
keys.End.New(),
|
||||||
|
}, nil))
|
||||||
|
}
|
7
vendor/golang.org/x/tools/internal/event/doc.go
generated
vendored
Normal file
7
vendor/golang.org/x/tools/internal/event/doc.go
generated
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Package event provides a set of packages that cover the main
|
||||||
|
// concepts of telemetry in an implementation agnostic way.
|
||||||
|
package event
|
127
vendor/golang.org/x/tools/internal/event/event.go
generated
vendored
Normal file
127
vendor/golang.org/x/tools/internal/event/event.go
generated
vendored
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package event
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"golang.org/x/tools/internal/event/core"
|
||||||
|
"golang.org/x/tools/internal/event/keys"
|
||||||
|
"golang.org/x/tools/internal/event/label"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Exporter is a function that handles events.
|
||||||
|
// It may return a modified context and event.
|
||||||
|
type Exporter func(context.Context, core.Event, label.Map) context.Context
|
||||||
|
|
||||||
|
// SetExporter sets the global exporter function that handles all events.
|
||||||
|
// The exporter is called synchronously from the event call site, so it should
|
||||||
|
// return quickly so as not to hold up user code.
|
||||||
|
func SetExporter(e Exporter) {
|
||||||
|
core.SetExporter(core.Exporter(e))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Log takes a message and a label list and combines them into a single event
|
||||||
|
// before delivering them to the exporter.
|
||||||
|
func Log(ctx context.Context, message string, labels ...label.Label) {
|
||||||
|
core.Export(ctx, core.MakeEvent([3]label.Label{
|
||||||
|
keys.Msg.Of(message),
|
||||||
|
}, labels))
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsLog returns true if the event was built by the Log function.
|
||||||
|
// It is intended to be used in exporters to identify the semantics of the
|
||||||
|
// event when deciding what to do with it.
|
||||||
|
func IsLog(ev core.Event) bool {
|
||||||
|
return ev.Label(0).Key() == keys.Msg
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error takes a message and a label list and combines them into a single event
|
||||||
|
// before delivering them to the exporter. It captures the error in the
|
||||||
|
// delivered event.
|
||||||
|
func Error(ctx context.Context, message string, err error, labels ...label.Label) {
|
||||||
|
core.Export(ctx, core.MakeEvent([3]label.Label{
|
||||||
|
keys.Msg.Of(message),
|
||||||
|
keys.Err.Of(err),
|
||||||
|
}, labels))
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsError returns true if the event was built by the Error function.
|
||||||
|
// It is intended to be used in exporters to identify the semantics of the
|
||||||
|
// event when deciding what to do with it.
|
||||||
|
func IsError(ev core.Event) bool {
|
||||||
|
return ev.Label(0).Key() == keys.Msg &&
|
||||||
|
ev.Label(1).Key() == keys.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Metric sends a label event to the exporter with the supplied labels.
|
||||||
|
func Metric(ctx context.Context, labels ...label.Label) {
|
||||||
|
core.Export(ctx, core.MakeEvent([3]label.Label{
|
||||||
|
keys.Metric.New(),
|
||||||
|
}, labels))
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsMetric returns true if the event was built by the Metric function.
|
||||||
|
// It is intended to be used in exporters to identify the semantics of the
|
||||||
|
// event when deciding what to do with it.
|
||||||
|
func IsMetric(ev core.Event) bool {
|
||||||
|
return ev.Label(0).Key() == keys.Metric
|
||||||
|
}
|
||||||
|
|
||||||
|
// Label sends a label event to the exporter with the supplied labels.
|
||||||
|
func Label(ctx context.Context, labels ...label.Label) context.Context {
|
||||||
|
return core.Export(ctx, core.MakeEvent([3]label.Label{
|
||||||
|
keys.Label.New(),
|
||||||
|
}, labels))
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsLabel returns true if the event was built by the Label function.
|
||||||
|
// It is intended to be used in exporters to identify the semantics of the
|
||||||
|
// event when deciding what to do with it.
|
||||||
|
func IsLabel(ev core.Event) bool {
|
||||||
|
return ev.Label(0).Key() == keys.Label
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start sends a span start event with the supplied label list to the exporter.
|
||||||
|
// It also returns a function that will end the span, which should normally be
|
||||||
|
// deferred.
|
||||||
|
func Start(ctx context.Context, name string, labels ...label.Label) (context.Context, func()) {
|
||||||
|
return core.ExportPair(ctx,
|
||||||
|
core.MakeEvent([3]label.Label{
|
||||||
|
keys.Start.Of(name),
|
||||||
|
}, labels),
|
||||||
|
core.MakeEvent([3]label.Label{
|
||||||
|
keys.End.New(),
|
||||||
|
}, nil))
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsStart returns true if the event was built by the Start function.
|
||||||
|
// It is intended to be used in exporters to identify the semantics of the
|
||||||
|
// event when deciding what to do with it.
|
||||||
|
func IsStart(ev core.Event) bool {
|
||||||
|
return ev.Label(0).Key() == keys.Start
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsEnd returns true if the event was built by the End function.
|
||||||
|
// It is intended to be used in exporters to identify the semantics of the
|
||||||
|
// event when deciding what to do with it.
|
||||||
|
func IsEnd(ev core.Event) bool {
|
||||||
|
return ev.Label(0).Key() == keys.End
|
||||||
|
}
|
||||||
|
|
||||||
|
// Detach returns a context without an associated span.
|
||||||
|
// This allows the creation of spans that are not children of the current span.
|
||||||
|
func Detach(ctx context.Context) context.Context {
|
||||||
|
return core.Export(ctx, core.MakeEvent([3]label.Label{
|
||||||
|
keys.Detach.New(),
|
||||||
|
}, nil))
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsDetach returns true if the event was built by the Detach function.
|
||||||
|
// It is intended to be used in exporters to identify the semantics of the
|
||||||
|
// event when deciding what to do with it.
|
||||||
|
func IsDetach(ev core.Event) bool {
|
||||||
|
return ev.Label(0).Key() == keys.Detach
|
||||||
|
}
|
564
vendor/golang.org/x/tools/internal/event/keys/keys.go
generated
vendored
Normal file
564
vendor/golang.org/x/tools/internal/event/keys/keys.go
generated
vendored
Normal file
|
@ -0,0 +1,564 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package keys
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"math"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"golang.org/x/tools/internal/event/label"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Value represents a key for untyped values.
|
||||||
|
type Value struct {
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
}
|
||||||
|
|
||||||
|
// New creates a new Key for untyped values.
|
||||||
|
func New(name, description string) *Value {
|
||||||
|
return &Value{name: name, description: description}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *Value) Name() string { return k.name }
|
||||||
|
func (k *Value) Description() string { return k.description }
|
||||||
|
|
||||||
|
func (k *Value) Format(w io.Writer, buf []byte, l label.Label) {
|
||||||
|
fmt.Fprint(w, k.From(l))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get can be used to get a label for the key from a label.Map.
|
||||||
|
func (k *Value) Get(lm label.Map) interface{} {
|
||||||
|
if t := lm.Find(k); t.Valid() {
|
||||||
|
return k.From(t)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// From can be used to get a value from a Label.
|
||||||
|
func (k *Value) From(t label.Label) interface{} { return t.UnpackValue() }
|
||||||
|
|
||||||
|
// Of creates a new Label with this key and the supplied value.
|
||||||
|
func (k *Value) Of(value interface{}) label.Label { return label.OfValue(k, value) }
|
||||||
|
|
||||||
|
// Tag represents a key for tagging labels that have no value.
|
||||||
|
// These are used when the existence of the label is the entire information it
|
||||||
|
// carries, such as marking events to be of a specific kind, or from a specific
|
||||||
|
// package.
|
||||||
|
type Tag struct {
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewTag creates a new Key for tagging labels.
|
||||||
|
func NewTag(name, description string) *Tag {
|
||||||
|
return &Tag{name: name, description: description}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *Tag) Name() string { return k.name }
|
||||||
|
func (k *Tag) Description() string { return k.description }
|
||||||
|
|
||||||
|
func (k *Tag) Format(w io.Writer, buf []byte, l label.Label) {}
|
||||||
|
|
||||||
|
// New creates a new Label with this key.
|
||||||
|
func (k *Tag) New() label.Label { return label.OfValue(k, nil) }
|
||||||
|
|
||||||
|
// Int represents a key
|
||||||
|
type Int struct {
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInt creates a new Key for int values.
|
||||||
|
func NewInt(name, description string) *Int {
|
||||||
|
return &Int{name: name, description: description}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *Int) Name() string { return k.name }
|
||||||
|
func (k *Int) Description() string { return k.description }
|
||||||
|
|
||||||
|
func (k *Int) Format(w io.Writer, buf []byte, l label.Label) {
|
||||||
|
w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Of creates a new Label with this key and the supplied value.
|
||||||
|
func (k *Int) Of(v int) label.Label { return label.Of64(k, uint64(v)) }
|
||||||
|
|
||||||
|
// Get can be used to get a label for the key from a label.Map.
|
||||||
|
func (k *Int) Get(lm label.Map) int {
|
||||||
|
if t := lm.Find(k); t.Valid() {
|
||||||
|
return k.From(t)
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// From can be used to get a value from a Label.
|
||||||
|
func (k *Int) From(t label.Label) int { return int(t.Unpack64()) }
|
||||||
|
|
||||||
|
// Int8 represents a key
|
||||||
|
type Int8 struct {
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInt8 creates a new Key for int8 values.
|
||||||
|
func NewInt8(name, description string) *Int8 {
|
||||||
|
return &Int8{name: name, description: description}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *Int8) Name() string { return k.name }
|
||||||
|
func (k *Int8) Description() string { return k.description }
|
||||||
|
|
||||||
|
func (k *Int8) Format(w io.Writer, buf []byte, l label.Label) {
|
||||||
|
w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Of creates a new Label with this key and the supplied value.
|
||||||
|
func (k *Int8) Of(v int8) label.Label { return label.Of64(k, uint64(v)) }
|
||||||
|
|
||||||
|
// Get can be used to get a label for the key from a label.Map.
|
||||||
|
func (k *Int8) Get(lm label.Map) int8 {
|
||||||
|
if t := lm.Find(k); t.Valid() {
|
||||||
|
return k.From(t)
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// From can be used to get a value from a Label.
|
||||||
|
func (k *Int8) From(t label.Label) int8 { return int8(t.Unpack64()) }
|
||||||
|
|
||||||
|
// Int16 represents a key
|
||||||
|
type Int16 struct {
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInt16 creates a new Key for int16 values.
|
||||||
|
func NewInt16(name, description string) *Int16 {
|
||||||
|
return &Int16{name: name, description: description}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *Int16) Name() string { return k.name }
|
||||||
|
func (k *Int16) Description() string { return k.description }
|
||||||
|
|
||||||
|
func (k *Int16) Format(w io.Writer, buf []byte, l label.Label) {
|
||||||
|
w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Of creates a new Label with this key and the supplied value.
|
||||||
|
func (k *Int16) Of(v int16) label.Label { return label.Of64(k, uint64(v)) }
|
||||||
|
|
||||||
|
// Get can be used to get a label for the key from a label.Map.
|
||||||
|
func (k *Int16) Get(lm label.Map) int16 {
|
||||||
|
if t := lm.Find(k); t.Valid() {
|
||||||
|
return k.From(t)
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// From can be used to get a value from a Label.
|
||||||
|
func (k *Int16) From(t label.Label) int16 { return int16(t.Unpack64()) }
|
||||||
|
|
||||||
|
// Int32 represents a key
|
||||||
|
type Int32 struct {
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInt32 creates a new Key for int32 values.
|
||||||
|
func NewInt32(name, description string) *Int32 {
|
||||||
|
return &Int32{name: name, description: description}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *Int32) Name() string { return k.name }
|
||||||
|
func (k *Int32) Description() string { return k.description }
|
||||||
|
|
||||||
|
func (k *Int32) Format(w io.Writer, buf []byte, l label.Label) {
|
||||||
|
w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Of creates a new Label with this key and the supplied value.
|
||||||
|
func (k *Int32) Of(v int32) label.Label { return label.Of64(k, uint64(v)) }
|
||||||
|
|
||||||
|
// Get can be used to get a label for the key from a label.Map.
|
||||||
|
func (k *Int32) Get(lm label.Map) int32 {
|
||||||
|
if t := lm.Find(k); t.Valid() {
|
||||||
|
return k.From(t)
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// From can be used to get a value from a Label.
|
||||||
|
func (k *Int32) From(t label.Label) int32 { return int32(t.Unpack64()) }
|
||||||
|
|
||||||
|
// Int64 represents a key
|
||||||
|
type Int64 struct {
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInt64 creates a new Key for int64 values.
|
||||||
|
func NewInt64(name, description string) *Int64 {
|
||||||
|
return &Int64{name: name, description: description}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *Int64) Name() string { return k.name }
|
||||||
|
func (k *Int64) Description() string { return k.description }
|
||||||
|
|
||||||
|
func (k *Int64) Format(w io.Writer, buf []byte, l label.Label) {
|
||||||
|
w.Write(strconv.AppendInt(buf, k.From(l), 10))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Of creates a new Label with this key and the supplied value.
|
||||||
|
func (k *Int64) Of(v int64) label.Label { return label.Of64(k, uint64(v)) }
|
||||||
|
|
||||||
|
// Get can be used to get a label for the key from a label.Map.
|
||||||
|
func (k *Int64) Get(lm label.Map) int64 {
|
||||||
|
if t := lm.Find(k); t.Valid() {
|
||||||
|
return k.From(t)
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// From can be used to get a value from a Label.
|
||||||
|
func (k *Int64) From(t label.Label) int64 { return int64(t.Unpack64()) }
|
||||||
|
|
||||||
|
// UInt represents a key
|
||||||
|
type UInt struct {
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewUInt creates a new Key for uint values.
|
||||||
|
func NewUInt(name, description string) *UInt {
|
||||||
|
return &UInt{name: name, description: description}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *UInt) Name() string { return k.name }
|
||||||
|
func (k *UInt) Description() string { return k.description }
|
||||||
|
|
||||||
|
func (k *UInt) Format(w io.Writer, buf []byte, l label.Label) {
|
||||||
|
w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Of creates a new Label with this key and the supplied value.
|
||||||
|
func (k *UInt) Of(v uint) label.Label { return label.Of64(k, uint64(v)) }
|
||||||
|
|
||||||
|
// Get can be used to get a label for the key from a label.Map.
|
||||||
|
func (k *UInt) Get(lm label.Map) uint {
|
||||||
|
if t := lm.Find(k); t.Valid() {
|
||||||
|
return k.From(t)
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// From can be used to get a value from a Label.
|
||||||
|
func (k *UInt) From(t label.Label) uint { return uint(t.Unpack64()) }
|
||||||
|
|
||||||
|
// UInt8 represents a key
|
||||||
|
type UInt8 struct {
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewUInt8 creates a new Key for uint8 values.
|
||||||
|
func NewUInt8(name, description string) *UInt8 {
|
||||||
|
return &UInt8{name: name, description: description}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *UInt8) Name() string { return k.name }
|
||||||
|
func (k *UInt8) Description() string { return k.description }
|
||||||
|
|
||||||
|
func (k *UInt8) Format(w io.Writer, buf []byte, l label.Label) {
|
||||||
|
w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Of creates a new Label with this key and the supplied value.
|
||||||
|
func (k *UInt8) Of(v uint8) label.Label { return label.Of64(k, uint64(v)) }
|
||||||
|
|
||||||
|
// Get can be used to get a label for the key from a label.Map.
|
||||||
|
func (k *UInt8) Get(lm label.Map) uint8 {
|
||||||
|
if t := lm.Find(k); t.Valid() {
|
||||||
|
return k.From(t)
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// From can be used to get a value from a Label.
|
||||||
|
func (k *UInt8) From(t label.Label) uint8 { return uint8(t.Unpack64()) }
|
||||||
|
|
||||||
|
// UInt16 represents a key
|
||||||
|
type UInt16 struct {
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewUInt16 creates a new Key for uint16 values.
|
||||||
|
func NewUInt16(name, description string) *UInt16 {
|
||||||
|
return &UInt16{name: name, description: description}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *UInt16) Name() string { return k.name }
|
||||||
|
func (k *UInt16) Description() string { return k.description }
|
||||||
|
|
||||||
|
func (k *UInt16) Format(w io.Writer, buf []byte, l label.Label) {
|
||||||
|
w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Of creates a new Label with this key and the supplied value.
|
||||||
|
func (k *UInt16) Of(v uint16) label.Label { return label.Of64(k, uint64(v)) }
|
||||||
|
|
||||||
|
// Get can be used to get a label for the key from a label.Map.
|
||||||
|
func (k *UInt16) Get(lm label.Map) uint16 {
|
||||||
|
if t := lm.Find(k); t.Valid() {
|
||||||
|
return k.From(t)
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// From can be used to get a value from a Label.
|
||||||
|
func (k *UInt16) From(t label.Label) uint16 { return uint16(t.Unpack64()) }
|
||||||
|
|
||||||
|
// UInt32 represents a key
|
||||||
|
type UInt32 struct {
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewUInt32 creates a new Key for uint32 values.
|
||||||
|
func NewUInt32(name, description string) *UInt32 {
|
||||||
|
return &UInt32{name: name, description: description}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *UInt32) Name() string { return k.name }
|
||||||
|
func (k *UInt32) Description() string { return k.description }
|
||||||
|
|
||||||
|
func (k *UInt32) Format(w io.Writer, buf []byte, l label.Label) {
|
||||||
|
w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Of creates a new Label with this key and the supplied value.
|
||||||
|
func (k *UInt32) Of(v uint32) label.Label { return label.Of64(k, uint64(v)) }
|
||||||
|
|
||||||
|
// Get can be used to get a label for the key from a label.Map.
|
||||||
|
func (k *UInt32) Get(lm label.Map) uint32 {
|
||||||
|
if t := lm.Find(k); t.Valid() {
|
||||||
|
return k.From(t)
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// From can be used to get a value from a Label.
|
||||||
|
func (k *UInt32) From(t label.Label) uint32 { return uint32(t.Unpack64()) }
|
||||||
|
|
||||||
|
// UInt64 represents a key
|
||||||
|
type UInt64 struct {
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewUInt64 creates a new Key for uint64 values.
|
||||||
|
func NewUInt64(name, description string) *UInt64 {
|
||||||
|
return &UInt64{name: name, description: description}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *UInt64) Name() string { return k.name }
|
||||||
|
func (k *UInt64) Description() string { return k.description }
|
||||||
|
|
||||||
|
func (k *UInt64) Format(w io.Writer, buf []byte, l label.Label) {
|
||||||
|
w.Write(strconv.AppendUint(buf, k.From(l), 10))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Of creates a new Label with this key and the supplied value.
|
||||||
|
func (k *UInt64) Of(v uint64) label.Label { return label.Of64(k, v) }
|
||||||
|
|
||||||
|
// Get can be used to get a label for the key from a label.Map.
|
||||||
|
func (k *UInt64) Get(lm label.Map) uint64 {
|
||||||
|
if t := lm.Find(k); t.Valid() {
|
||||||
|
return k.From(t)
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// From can be used to get a value from a Label.
|
||||||
|
func (k *UInt64) From(t label.Label) uint64 { return t.Unpack64() }
|
||||||
|
|
||||||
|
// Float32 represents a key
|
||||||
|
type Float32 struct {
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFloat32 creates a new Key for float32 values.
|
||||||
|
func NewFloat32(name, description string) *Float32 {
|
||||||
|
return &Float32{name: name, description: description}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *Float32) Name() string { return k.name }
|
||||||
|
func (k *Float32) Description() string { return k.description }
|
||||||
|
|
||||||
|
func (k *Float32) Format(w io.Writer, buf []byte, l label.Label) {
|
||||||
|
w.Write(strconv.AppendFloat(buf, float64(k.From(l)), 'E', -1, 32))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Of creates a new Label with this key and the supplied value.
|
||||||
|
func (k *Float32) Of(v float32) label.Label {
|
||||||
|
return label.Of64(k, uint64(math.Float32bits(v)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get can be used to get a label for the key from a label.Map.
|
||||||
|
func (k *Float32) Get(lm label.Map) float32 {
|
||||||
|
if t := lm.Find(k); t.Valid() {
|
||||||
|
return k.From(t)
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// From can be used to get a value from a Label.
|
||||||
|
func (k *Float32) From(t label.Label) float32 {
|
||||||
|
return math.Float32frombits(uint32(t.Unpack64()))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64 represents a key
|
||||||
|
type Float64 struct {
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFloat64 creates a new Key for int64 values.
|
||||||
|
func NewFloat64(name, description string) *Float64 {
|
||||||
|
return &Float64{name: name, description: description}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *Float64) Name() string { return k.name }
|
||||||
|
func (k *Float64) Description() string { return k.description }
|
||||||
|
|
||||||
|
func (k *Float64) Format(w io.Writer, buf []byte, l label.Label) {
|
||||||
|
w.Write(strconv.AppendFloat(buf, k.From(l), 'E', -1, 64))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Of creates a new Label with this key and the supplied value.
|
||||||
|
func (k *Float64) Of(v float64) label.Label {
|
||||||
|
return label.Of64(k, math.Float64bits(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get can be used to get a label for the key from a label.Map.
|
||||||
|
func (k *Float64) Get(lm label.Map) float64 {
|
||||||
|
if t := lm.Find(k); t.Valid() {
|
||||||
|
return k.From(t)
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// From can be used to get a value from a Label.
|
||||||
|
func (k *Float64) From(t label.Label) float64 {
|
||||||
|
return math.Float64frombits(t.Unpack64())
|
||||||
|
}
|
||||||
|
|
||||||
|
// String represents a key
|
||||||
|
type String struct {
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewString creates a new Key for int64 values.
|
||||||
|
func NewString(name, description string) *String {
|
||||||
|
return &String{name: name, description: description}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *String) Name() string { return k.name }
|
||||||
|
func (k *String) Description() string { return k.description }
|
||||||
|
|
||||||
|
func (k *String) Format(w io.Writer, buf []byte, l label.Label) {
|
||||||
|
w.Write(strconv.AppendQuote(buf, k.From(l)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Of creates a new Label with this key and the supplied value.
|
||||||
|
func (k *String) Of(v string) label.Label { return label.OfString(k, v) }
|
||||||
|
|
||||||
|
// Get can be used to get a label for the key from a label.Map.
|
||||||
|
func (k *String) Get(lm label.Map) string {
|
||||||
|
if t := lm.Find(k); t.Valid() {
|
||||||
|
return k.From(t)
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// From can be used to get a value from a Label.
|
||||||
|
func (k *String) From(t label.Label) string { return t.UnpackString() }
|
||||||
|
|
||||||
|
// Boolean represents a key
|
||||||
|
type Boolean struct {
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewBoolean creates a new Key for bool values.
|
||||||
|
func NewBoolean(name, description string) *Boolean {
|
||||||
|
return &Boolean{name: name, description: description}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *Boolean) Name() string { return k.name }
|
||||||
|
func (k *Boolean) Description() string { return k.description }
|
||||||
|
|
||||||
|
func (k *Boolean) Format(w io.Writer, buf []byte, l label.Label) {
|
||||||
|
w.Write(strconv.AppendBool(buf, k.From(l)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Of creates a new Label with this key and the supplied value.
|
||||||
|
func (k *Boolean) Of(v bool) label.Label {
|
||||||
|
if v {
|
||||||
|
return label.Of64(k, 1)
|
||||||
|
}
|
||||||
|
return label.Of64(k, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get can be used to get a label for the key from a label.Map.
|
||||||
|
func (k *Boolean) Get(lm label.Map) bool {
|
||||||
|
if t := lm.Find(k); t.Valid() {
|
||||||
|
return k.From(t)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// From can be used to get a value from a Label.
|
||||||
|
func (k *Boolean) From(t label.Label) bool { return t.Unpack64() > 0 }
|
||||||
|
|
||||||
|
// Error represents a key
|
||||||
|
type Error struct {
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewError creates a new Key for int64 values.
|
||||||
|
func NewError(name, description string) *Error {
|
||||||
|
return &Error{name: name, description: description}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *Error) Name() string { return k.name }
|
||||||
|
func (k *Error) Description() string { return k.description }
|
||||||
|
|
||||||
|
func (k *Error) Format(w io.Writer, buf []byte, l label.Label) {
|
||||||
|
io.WriteString(w, k.From(l).Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Of creates a new Label with this key and the supplied value.
|
||||||
|
func (k *Error) Of(v error) label.Label { return label.OfValue(k, v) }
|
||||||
|
|
||||||
|
// Get can be used to get a label for the key from a label.Map.
|
||||||
|
func (k *Error) Get(lm label.Map) error {
|
||||||
|
if t := lm.Find(k); t.Valid() {
|
||||||
|
return k.From(t)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// From can be used to get a value from a Label.
|
||||||
|
func (k *Error) From(t label.Label) error {
|
||||||
|
err, _ := t.UnpackValue().(error)
|
||||||
|
return err
|
||||||
|
}
|
22
vendor/golang.org/x/tools/internal/event/keys/standard.go
generated
vendored
Normal file
22
vendor/golang.org/x/tools/internal/event/keys/standard.go
generated
vendored
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
// Copyright 2020 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package keys
|
||||||
|
|
||||||
|
var (
|
||||||
|
// Msg is a key used to add message strings to label lists.
|
||||||
|
Msg = NewString("message", "a readable message")
|
||||||
|
// Label is a key used to indicate an event adds labels to the context.
|
||||||
|
Label = NewTag("label", "a label context marker")
|
||||||
|
// Start is used for things like traces that have a name.
|
||||||
|
Start = NewString("start", "span start")
|
||||||
|
// Metric is a key used to indicate an event records metrics.
|
||||||
|
End = NewTag("end", "a span end marker")
|
||||||
|
// Metric is a key used to indicate an event records metrics.
|
||||||
|
Detach = NewTag("detach", "a span detach marker")
|
||||||
|
// Err is a key used to add error values to label lists.
|
||||||
|
Err = NewError("error", "an error that occurred")
|
||||||
|
// Metric is a key used to indicate an event records metrics.
|
||||||
|
Metric = NewTag("metric", "a metric event marker")
|
||||||
|
)
|
213
vendor/golang.org/x/tools/internal/event/label/label.go
generated
vendored
Normal file
213
vendor/golang.org/x/tools/internal/event/label/label.go
generated
vendored
Normal file
|
@ -0,0 +1,213 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package label
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"reflect"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Key is used as the identity of a Label.
|
||||||
|
// Keys are intended to be compared by pointer only, the name should be unique
|
||||||
|
// for communicating with external systems, but it is not required or enforced.
|
||||||
|
type Key interface {
|
||||||
|
// Name returns the key name.
|
||||||
|
Name() string
|
||||||
|
// Description returns a string that can be used to describe the value.
|
||||||
|
Description() string
|
||||||
|
|
||||||
|
// Format is used in formatting to append the value of the label to the
|
||||||
|
// supplied buffer.
|
||||||
|
// The formatter may use the supplied buf as a scratch area to avoid
|
||||||
|
// allocations.
|
||||||
|
Format(w io.Writer, buf []byte, l Label)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Label holds a key and value pair.
|
||||||
|
// It is normally used when passing around lists of labels.
|
||||||
|
type Label struct {
|
||||||
|
key Key
|
||||||
|
packed uint64
|
||||||
|
untyped interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map is the interface to a collection of Labels indexed by key.
|
||||||
|
type Map interface {
|
||||||
|
// Find returns the label that matches the supplied key.
|
||||||
|
Find(key Key) Label
|
||||||
|
}
|
||||||
|
|
||||||
|
// List is the interface to something that provides an iterable
|
||||||
|
// list of labels.
|
||||||
|
// Iteration should start from 0 and continue until Valid returns false.
|
||||||
|
type List interface {
|
||||||
|
// Valid returns true if the index is within range for the list.
|
||||||
|
// It does not imply the label at that index will itself be valid.
|
||||||
|
Valid(index int) bool
|
||||||
|
// Label returns the label at the given index.
|
||||||
|
Label(index int) Label
|
||||||
|
}
|
||||||
|
|
||||||
|
// list implements LabelList for a list of Labels.
|
||||||
|
type list struct {
|
||||||
|
labels []Label
|
||||||
|
}
|
||||||
|
|
||||||
|
// filter wraps a LabelList filtering out specific labels.
|
||||||
|
type filter struct {
|
||||||
|
keys []Key
|
||||||
|
underlying List
|
||||||
|
}
|
||||||
|
|
||||||
|
// listMap implements LabelMap for a simple list of labels.
|
||||||
|
type listMap struct {
|
||||||
|
labels []Label
|
||||||
|
}
|
||||||
|
|
||||||
|
// mapChain implements LabelMap for a list of underlying LabelMap.
|
||||||
|
type mapChain struct {
|
||||||
|
maps []Map
|
||||||
|
}
|
||||||
|
|
||||||
|
// OfValue creates a new label from the key and value.
|
||||||
|
// This method is for implementing new key types, label creation should
|
||||||
|
// normally be done with the Of method of the key.
|
||||||
|
func OfValue(k Key, value interface{}) Label { return Label{key: k, untyped: value} }
|
||||||
|
|
||||||
|
// UnpackValue assumes the label was built using LabelOfValue and returns the value
|
||||||
|
// that was passed to that constructor.
|
||||||
|
// This method is for implementing new key types, for type safety normal
|
||||||
|
// access should be done with the From method of the key.
|
||||||
|
func (t Label) UnpackValue() interface{} { return t.untyped }
|
||||||
|
|
||||||
|
// Of64 creates a new label from a key and a uint64. This is often
|
||||||
|
// used for non uint64 values that can be packed into a uint64.
|
||||||
|
// This method is for implementing new key types, label creation should
|
||||||
|
// normally be done with the Of method of the key.
|
||||||
|
func Of64(k Key, v uint64) Label { return Label{key: k, packed: v} }
|
||||||
|
|
||||||
|
// Unpack64 assumes the label was built using LabelOf64 and returns the value that
|
||||||
|
// was passed to that constructor.
|
||||||
|
// This method is for implementing new key types, for type safety normal
|
||||||
|
// access should be done with the From method of the key.
|
||||||
|
func (t Label) Unpack64() uint64 { return t.packed }
|
||||||
|
|
||||||
|
// OfString creates a new label from a key and a string.
|
||||||
|
// This method is for implementing new key types, label creation should
|
||||||
|
// normally be done with the Of method of the key.
|
||||||
|
func OfString(k Key, v string) Label {
|
||||||
|
hdr := (*reflect.StringHeader)(unsafe.Pointer(&v))
|
||||||
|
return Label{
|
||||||
|
key: k,
|
||||||
|
packed: uint64(hdr.Len),
|
||||||
|
untyped: unsafe.Pointer(hdr.Data),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnpackString assumes the label was built using LabelOfString and returns the
|
||||||
|
// value that was passed to that constructor.
|
||||||
|
// This method is for implementing new key types, for type safety normal
|
||||||
|
// access should be done with the From method of the key.
|
||||||
|
func (t Label) UnpackString() string {
|
||||||
|
var v string
|
||||||
|
hdr := (*reflect.StringHeader)(unsafe.Pointer(&v))
|
||||||
|
hdr.Data = uintptr(t.untyped.(unsafe.Pointer))
|
||||||
|
hdr.Len = int(t.packed)
|
||||||
|
return *(*string)(unsafe.Pointer(hdr))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Valid returns true if the Label is a valid one (it has a key).
|
||||||
|
func (t Label) Valid() bool { return t.key != nil }
|
||||||
|
|
||||||
|
// Key returns the key of this Label.
|
||||||
|
func (t Label) Key() Key { return t.key }
|
||||||
|
|
||||||
|
// Format is used for debug printing of labels.
|
||||||
|
func (t Label) Format(f fmt.State, r rune) {
|
||||||
|
if !t.Valid() {
|
||||||
|
io.WriteString(f, `nil`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
io.WriteString(f, t.Key().Name())
|
||||||
|
io.WriteString(f, "=")
|
||||||
|
var buf [128]byte
|
||||||
|
t.Key().Format(f, buf[:0], t)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *list) Valid(index int) bool {
|
||||||
|
return index >= 0 && index < len(l.labels)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *list) Label(index int) Label {
|
||||||
|
return l.labels[index]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *filter) Valid(index int) bool {
|
||||||
|
return f.underlying.Valid(index)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *filter) Label(index int) Label {
|
||||||
|
l := f.underlying.Label(index)
|
||||||
|
for _, f := range f.keys {
|
||||||
|
if l.Key() == f {
|
||||||
|
return Label{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
func (lm listMap) Find(key Key) Label {
|
||||||
|
for _, l := range lm.labels {
|
||||||
|
if l.Key() == key {
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Label{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c mapChain) Find(key Key) Label {
|
||||||
|
for _, src := range c.maps {
|
||||||
|
l := src.Find(key)
|
||||||
|
if l.Valid() {
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Label{}
|
||||||
|
}
|
||||||
|
|
||||||
|
var emptyList = &list{}
|
||||||
|
|
||||||
|
func NewList(labels ...Label) List {
|
||||||
|
if len(labels) == 0 {
|
||||||
|
return emptyList
|
||||||
|
}
|
||||||
|
return &list{labels: labels}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Filter(l List, keys ...Key) List {
|
||||||
|
if len(keys) == 0 {
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
return &filter{keys: keys, underlying: l}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewMap(labels ...Label) Map {
|
||||||
|
return listMap{labels: labels}
|
||||||
|
}
|
||||||
|
|
||||||
|
func MergeMaps(srcs ...Map) Map {
|
||||||
|
var nonNil []Map
|
||||||
|
for _, src := range srcs {
|
||||||
|
if src != nil {
|
||||||
|
nonNil = append(nonNil, src)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(nonNil) == 1 {
|
||||||
|
return nonNil[0]
|
||||||
|
}
|
||||||
|
return mapChain{maps: nonNil}
|
||||||
|
}
|
7
vendor/golang.org/x/tools/internal/gocommand/invoke.go
generated
vendored
7
vendor/golang.org/x/tools/internal/gocommand/invoke.go
generated
vendored
|
@ -17,7 +17,7 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"golang.org/x/tools/internal/telemetry/event"
|
"golang.org/x/tools/internal/event"
|
||||||
)
|
)
|
||||||
|
|
||||||
// An Runner will run go command invocations and serialize
|
// An Runner will run go command invocations and serialize
|
||||||
|
@ -39,7 +39,7 @@ func (runner *Runner) Run(ctx context.Context, inv Invocation) (*bytes.Buffer, e
|
||||||
return stdout, friendly
|
return stdout, friendly
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run calls Innvocation.RunRaw, serializing requests if they fight over
|
// RunRaw calls Invocation.runRaw, serializing requests if they fight over
|
||||||
// go.mod changes.
|
// go.mod changes.
|
||||||
func (runner *Runner) RunRaw(ctx context.Context, inv Invocation) (*bytes.Buffer, *bytes.Buffer, error, error) {
|
func (runner *Runner) RunRaw(ctx context.Context, inv Invocation) (*bytes.Buffer, *bytes.Buffer, error, error) {
|
||||||
// We want to run invocations concurrently as much as possible. However,
|
// We want to run invocations concurrently as much as possible. However,
|
||||||
|
@ -93,6 +93,7 @@ func (i *Invocation) runRaw(ctx context.Context) (stdout *bytes.Buffer, stderr *
|
||||||
stderr = &bytes.Buffer{}
|
stderr = &bytes.Buffer{}
|
||||||
rawError = i.RunPiped(ctx, stdout, stderr)
|
rawError = i.RunPiped(ctx, stdout, stderr)
|
||||||
if rawError != nil {
|
if rawError != nil {
|
||||||
|
friendlyError = rawError
|
||||||
// Check for 'go' executable not being found.
|
// Check for 'go' executable not being found.
|
||||||
if ee, ok := rawError.(*exec.Error); ok && ee.Err == exec.ErrNotFound {
|
if ee, ok := rawError.(*exec.Error); ok && ee.Err == exec.ErrNotFound {
|
||||||
friendlyError = fmt.Errorf("go command required, not found: %v", ee)
|
friendlyError = fmt.Errorf("go command required, not found: %v", ee)
|
||||||
|
@ -100,7 +101,7 @@ func (i *Invocation) runRaw(ctx context.Context) (stdout *bytes.Buffer, stderr *
|
||||||
if ctx.Err() != nil {
|
if ctx.Err() != nil {
|
||||||
friendlyError = ctx.Err()
|
friendlyError = ctx.Err()
|
||||||
}
|
}
|
||||||
friendlyError = fmt.Errorf("err: %v: stderr: %s", rawError, stderr)
|
friendlyError = fmt.Errorf("err: %v: stderr: %s", friendlyError, stderr)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
102
vendor/golang.org/x/tools/internal/gocommand/vendor.go
generated
vendored
Normal file
102
vendor/golang.org/x/tools/internal/gocommand/vendor.go
generated
vendored
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
// Copyright 2020 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package gocommand
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"golang.org/x/mod/semver"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ModuleJSON holds information about a module.
|
||||||
|
type ModuleJSON struct {
|
||||||
|
Path string // module path
|
||||||
|
Replace *ModuleJSON // replaced by this module
|
||||||
|
Main bool // is this the main module?
|
||||||
|
Indirect bool // is this module only an indirect dependency of main module?
|
||||||
|
Dir string // directory holding files for this module, if any
|
||||||
|
GoMod string // path to go.mod file for this module, if any
|
||||||
|
GoVersion string // go version used in module
|
||||||
|
}
|
||||||
|
|
||||||
|
var modFlagRegexp = regexp.MustCompile(`-mod[ =](\w+)`)
|
||||||
|
|
||||||
|
// VendorEnabled reports whether vendoring is enabled. It takes a *Runner to execute Go commands
|
||||||
|
// with the supplied context.Context and Invocation. The Invocation can contain pre-defined fields,
|
||||||
|
// of which only Verb and Args are modified to run the appropriate Go command.
|
||||||
|
// Inspired by setDefaultBuildMod in modload/init.go
|
||||||
|
func VendorEnabled(ctx context.Context, inv Invocation, r *Runner) (*ModuleJSON, bool, error) {
|
||||||
|
mainMod, go114, err := getMainModuleAnd114(ctx, inv, r)
|
||||||
|
if err != nil {
|
||||||
|
return nil, false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// We check the GOFLAGS to see if there is anything overridden or not.
|
||||||
|
inv.Verb = "env"
|
||||||
|
inv.Args = []string{"GOFLAGS"}
|
||||||
|
stdout, err := r.Run(ctx, inv)
|
||||||
|
if err != nil {
|
||||||
|
return nil, false, err
|
||||||
|
}
|
||||||
|
goflags := string(bytes.TrimSpace(stdout.Bytes()))
|
||||||
|
matches := modFlagRegexp.FindStringSubmatch(goflags)
|
||||||
|
var modFlag string
|
||||||
|
if len(matches) != 0 {
|
||||||
|
modFlag = matches[1]
|
||||||
|
}
|
||||||
|
if modFlag != "" {
|
||||||
|
// Don't override an explicit '-mod=' argument.
|
||||||
|
return mainMod, modFlag == "vendor", nil
|
||||||
|
}
|
||||||
|
if mainMod == nil || !go114 {
|
||||||
|
return mainMod, false, nil
|
||||||
|
}
|
||||||
|
// Check 1.14's automatic vendor mode.
|
||||||
|
if fi, err := os.Stat(filepath.Join(mainMod.Dir, "vendor")); err == nil && fi.IsDir() {
|
||||||
|
if mainMod.GoVersion != "" && semver.Compare("v"+mainMod.GoVersion, "v1.14") >= 0 {
|
||||||
|
// The Go version is at least 1.14, and a vendor directory exists.
|
||||||
|
// Set -mod=vendor by default.
|
||||||
|
return mainMod, true, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mainMod, false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// getMainModuleAnd114 gets the main module's information and whether the
|
||||||
|
// go command in use is 1.14+. This is the information needed to figure out
|
||||||
|
// if vendoring should be enabled.
|
||||||
|
func getMainModuleAnd114(ctx context.Context, inv Invocation, r *Runner) (*ModuleJSON, bool, error) {
|
||||||
|
const format = `{{.Path}}
|
||||||
|
{{.Dir}}
|
||||||
|
{{.GoMod}}
|
||||||
|
{{.GoVersion}}
|
||||||
|
{{range context.ReleaseTags}}{{if eq . "go1.14"}}{{.}}{{end}}{{end}}
|
||||||
|
`
|
||||||
|
inv.Verb = "list"
|
||||||
|
inv.Args = []string{"-m", "-f", format}
|
||||||
|
stdout, err := r.Run(ctx, inv)
|
||||||
|
if err != nil {
|
||||||
|
return nil, false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
lines := strings.Split(stdout.String(), "\n")
|
||||||
|
if len(lines) < 5 {
|
||||||
|
return nil, false, fmt.Errorf("unexpected stdout: %q", stdout.String())
|
||||||
|
}
|
||||||
|
mod := &ModuleJSON{
|
||||||
|
Path: lines[0],
|
||||||
|
Dir: lines[1],
|
||||||
|
GoMod: lines[2],
|
||||||
|
GoVersion: lines[3],
|
||||||
|
Main: true,
|
||||||
|
}
|
||||||
|
return mod, lines[4] == "go1.14", nil
|
||||||
|
}
|
8
vendor/golang.org/x/tools/internal/imports/fix.go
generated
vendored
8
vendor/golang.org/x/tools/internal/imports/fix.go
generated
vendored
|
@ -50,7 +50,8 @@ var importToGroup = []func(env *ProcessEnv, importPath string) (num int, ok bool
|
||||||
return
|
return
|
||||||
},
|
},
|
||||||
func(_ *ProcessEnv, importPath string) (num int, ok bool) {
|
func(_ *ProcessEnv, importPath string) (num int, ok bool) {
|
||||||
if strings.Contains(importPath, ".") {
|
firstComponent := strings.Split(importPath, "/")[0]
|
||||||
|
if strings.Contains(firstComponent, ".") {
|
||||||
return 1, true
|
return 1, true
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
@ -1324,7 +1325,10 @@ func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string, incl
|
||||||
fullFile := filepath.Join(dir, fi.Name())
|
fullFile := filepath.Join(dir, fi.Name())
|
||||||
f, err := parser.ParseFile(fset, fullFile, nil, 0)
|
f, err := parser.ParseFile(fset, fullFile, nil, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", nil, fmt.Errorf("parsing %s: %v", fullFile, err)
|
if env.Logf != nil {
|
||||||
|
env.Logf("error parsing %v: %v", fullFile, err)
|
||||||
|
}
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
if f.Name.Name == "documentation" {
|
if f.Name.Name == "documentation" {
|
||||||
// Special case from go/build.ImportDir, not
|
// Special case from go/build.ImportDir, not
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user