diff --git a/api/openapi.yaml b/api/openapi.yaml index 66b73db3..63adaed6 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -85,6 +85,11 @@ components: type: string writeTimeout: type: string + readBufferCount: + type: integer + format: int64 + nullable: true + deprecated: true writeQueueSize: type: integer format: int64 @@ -110,6 +115,10 @@ components: $ref: '#/components/schemas/AuthInternalUser' authHTTPAddress: type: string + externalAuthenticationURL: + type: string + nullable: true + deprecated: true authHTTPFingerprint: type: string authHTTPExclude: @@ -144,6 +153,10 @@ components: type: string apiServerCert: type: string + apiAllowOrigin: + type: string + nullable: true + deprecated: true apiAllowOrigins: type: array items: @@ -164,6 +177,10 @@ components: type: string metricsServerCert: type: string + metricsAllowOrigin: + type: string + nullable: true + deprecated: true metricsAllowOrigins: type: array items: @@ -184,6 +201,10 @@ components: type: string pprofServerCert: type: string + pprofAllowOrigin: + type: string + nullable: true + deprecated: true pprofAllowOrigins: type: array items: @@ -204,6 +225,10 @@ components: type: string playbackServerCert: type: string + playbackAllowOrigin: + type: string + nullable: true + deprecated: true playbackAllowOrigins: type: array items: @@ -216,10 +241,24 @@ components: # RTSP server rtsp: type: boolean + rtspDisable: + type: boolean + nullable: true + deprecated: true + protocols: + type: array + nullable: true + items: + type: string + deprecated: true rtspTransports: type: array items: type: string + encryption: + type: string + nullable: true + deprecated: true rtspEncryption: type: string rtspAddress: @@ -252,14 +291,29 @@ components: type: string rtspServerCert: type: string + authMethods: + type: array + nullable: true + items: + type: string + deprecated: true rtspAuthMethods: type: array items: type: string + rtspUDPReadBufferSize: + type: integer + format: uint64 + nullable: true + deprecated: true # RTMP server rtmp: type: boolean + rtmpDisable: + type: boolean + nullable: true + deprecated: true rtmpEncryption: type: string rtmpAddress: @@ -274,6 +328,10 @@ components: # HLS server hls: type: boolean + hlsDisable: + type: boolean + nullable: true + deprecated: true hlsAddress: type: string hlsEncryption: @@ -282,6 +340,10 @@ components: type: string hlsServerCert: type: string + hlsAllowOrigin: + type: string + nullable: true + deprecated: true hlsAllowOrigins: type: array items: @@ -311,6 +373,10 @@ components: # WebRTC server webrtc: type: boolean + webrtcDisable: + type: boolean + nullable: true + deprecated: true webrtcAddress: type: string webrtcEncryption: @@ -319,6 +385,10 @@ components: type: string webrtcServerCert: type: string + webrtcAllowOrigin: + type: string + nullable: true + deprecated: true webrtcAllowOrigins: type: array items: @@ -351,6 +421,26 @@ components: type: string webrtcTrackGatherTimeout: type: string + webrtcICEUDPMuxAddress: + type: string + nullable: true + deprecated: true + webrtcICETCPMuxAddress: + type: string + nullable: true + deprecated: true + webrtcICEHostNAT1To1IPs: + type: array + nullable: true + items: + type: string + deprecated: true + webrtcICEServers: + type: array + nullable: true + items: + type: string + deprecated: true # SRT server srt: @@ -358,6 +448,32 @@ components: srtAddress: type: string + # Record (deprecated) + record: + type: boolean + nullable: true + deprecated: true + recordPath: + type: string + nullable: true + deprecated: true + recordFormat: + type: string + nullable: true + deprecated: true + recordPartDuration: + type: string + nullable: true + deprecated: true + recordSegmentDuration: + type: string + nullable: true + deprecated: true + recordDeleteAfter: + type: string + nullable: true + deprecated: true + PathConf: type: object properties: @@ -380,6 +496,10 @@ components: format: int64 srtReadPassphrase: type: string + fallback: + type: string + nullable: true + deprecated: true useAbsoluteTimestamp: type: boolean @@ -396,6 +516,10 @@ components: # Record record: type: boolean + playback: + type: boolean + nullable: true + deprecated: true recordPath: type: string recordFormat: @@ -409,9 +533,43 @@ components: recordDeleteAfter: type: string + # Authentication (deprecated) + publishUser: + type: string + nullable: true + deprecated: true + publishPass: + type: string + nullable: true + deprecated: true + publishIPs: + type: array + nullable: true + items: + type: string + deprecated: true + readUser: + type: string + nullable: true + deprecated: true + readPass: + type: string + nullable: true + deprecated: true + readIPs: + type: array + nullable: true + items: + type: string + deprecated: true + # Publisher source overridePublisher: type: boolean + disablePublisherOverride: + type: boolean + nullable: true + deprecated: true srtPublishPassphrase: type: string @@ -420,10 +578,23 @@ components: type: string rtspAnyPort: type: boolean + sourceProtocol: + type: string + nullable: true + deprecated: true + sourceAnyPortEnable: + type: boolean + nullable: true + deprecated: true rtspRangeType: type: string rtspRangeStart: type: string + rtspUDPReadBufferSize: + type: integer + format: uint64 + nullable: true + deprecated: true rtspUDPSourcePortRange: type: array minItems: 2 @@ -432,9 +603,21 @@ components: type: integer format: uint64 + # MPEG-TS source + mpegtsUDPReadBufferSize: + type: integer + format: uint64 + nullable: true + deprecated: true + # RTP source rtpSDP: type: string + rtpUDPReadBufferSize: + type: integer + format: uint64 + nullable: true + deprecated: true # WHEP source whepBearerToken: @@ -539,6 +722,14 @@ components: rpiCameraBitrate: type: integer format: uint64 + rpiCameraProfile: + type: string + nullable: true + deprecated: true + rpiCameraLevel: + type: string + nullable: true + deprecated: true rpiCameraHardwareH264Profile: type: string rpiCameraHardwareH264Level: @@ -547,6 +738,11 @@ components: type: string rpiCameraSoftwareH264Level: type: string + rpiCameraJPEGQuality: + type: integer + format: uint64 + nullable: true + deprecated: true rpiCameraMJPEGQuality: type: integer format: uint64 @@ -609,9 +805,11 @@ components: nullable: true ready: type: boolean + deprecated: true readyTime: type: string nullable: true + deprecated: true available: type: boolean availableTime: diff --git a/internal/conf/conf.go b/internal/conf/conf.go index 98431525..1188972f 100644 --- a/internal/conf/conf.go +++ b/internal/conf/conf.go @@ -249,7 +249,7 @@ type Conf struct { DumpPackets bool `json:"dumpPackets"` ReadTimeout Duration `json:"readTimeout"` WriteTimeout Duration `json:"writeTimeout"` - ReadBufferCount *int `json:"readBufferCount,omitempty"` // deprecated + ReadBufferCount *int `json:"readBufferCount,omitempty" deprecated:"true"` WriteQueueSize int `json:"writeQueueSize"` UDPMaxPayloadSize int `json:"udpMaxPayloadSize"` UDPReadBufferSize uint `json:"udpReadBufferSize"` @@ -261,7 +261,7 @@ type Conf struct { AuthMethod AuthMethod `json:"authMethod"` AuthInternalUsers []AuthInternalUser `json:"authInternalUsers"` AuthHTTPAddress string `json:"authHTTPAddress"` - ExternalAuthenticationURL *string `json:"externalAuthenticationURL,omitempty"` // deprecated + ExternalAuthenticationURL *string `json:"externalAuthenticationURL,omitempty" deprecated:"true"` AuthHTTPFingerprint string `json:"authHTTPFingerprint"` AuthHTTPExclude []AuthInternalUserPermission `json:"authHTTPExclude"` AuthJWTJWKS string `json:"authJWTJWKS"` @@ -278,7 +278,7 @@ type Conf struct { APIEncryption bool `json:"apiEncryption"` APIServerKey string `json:"apiServerKey"` APIServerCert string `json:"apiServerCert"` - APIAllowOrigin *string `json:"apiAllowOrigin,omitempty"` // deprecated + APIAllowOrigin *string `json:"apiAllowOrigin,omitempty" deprecated:"true"` APIAllowOrigins []string `json:"apiAllowOrigins"` APITrustedProxies IPNetworks `json:"apiTrustedProxies"` @@ -288,7 +288,7 @@ type Conf struct { MetricsEncryption bool `json:"metricsEncryption"` MetricsServerKey string `json:"metricsServerKey"` MetricsServerCert string `json:"metricsServerCert"` - MetricsAllowOrigin *string `json:"metricsAllowOrigin,omitempty"` // deprecated + MetricsAllowOrigin *string `json:"metricsAllowOrigin,omitempty" deprecated:"true"` MetricsAllowOrigins []string `json:"metricsAllowOrigins"` MetricsTrustedProxies IPNetworks `json:"metricsTrustedProxies"` @@ -298,7 +298,7 @@ type Conf struct { PPROFEncryption bool `json:"pprofEncryption"` PPROFServerKey string `json:"pprofServerKey"` PPROFServerCert string `json:"pprofServerCert"` - PPROFAllowOrigin *string `json:"pprofAllowOrigin,omitempty"` // deprecated + PPROFAllowOrigin *string `json:"pprofAllowOrigin,omitempty" deprecated:"true"` PPROFAllowOrigins []string `json:"pprofAllowOrigins"` PPROFTrustedProxies IPNetworks `json:"pprofTrustedProxies"` @@ -308,16 +308,16 @@ type Conf struct { PlaybackEncryption bool `json:"playbackEncryption"` PlaybackServerKey string `json:"playbackServerKey"` PlaybackServerCert string `json:"playbackServerCert"` - PlaybackAllowOrigin *string `json:"playbackAllowOrigin,omitempty"` // deprecated + PlaybackAllowOrigin *string `json:"playbackAllowOrigin,omitempty" deprecated:"true"` PlaybackAllowOrigins []string `json:"playbackAllowOrigins"` PlaybackTrustedProxies IPNetworks `json:"playbackTrustedProxies"` // RTSP server RTSP bool `json:"rtsp"` - RTSPDisable *bool `json:"rtspDisable,omitempty"` // deprecated - Protocols *RTSPTransports `json:"protocols,omitempty"` // deprecated + RTSPDisable *bool `json:"rtspDisable,omitempty" deprecated:"true"` + Protocols *RTSPTransports `json:"protocols,omitempty" deprecated:"true"` RTSPTransports RTSPTransports `json:"rtspTransports"` - Encryption *Encryption `json:"encryption,omitempty"` // deprecated + Encryption *Encryption `json:"encryption,omitempty" deprecated:"true"` RTSPEncryption Encryption `json:"rtspEncryption"` RTSPAddress string `json:"rtspAddress"` RTSPSAddress string `json:"rtspsAddress"` @@ -334,13 +334,13 @@ type Conf struct { ServerCert *string `json:"serverCert,omitempty"` RTSPServerKey string `json:"rtspServerKey"` RTSPServerCert string `json:"rtspServerCert"` - AuthMethods *RTSPAuthMethods `json:"authMethods,omitempty"` // deprecated + AuthMethods *RTSPAuthMethods `json:"authMethods,omitempty" deprecated:"true"` RTSPAuthMethods RTSPAuthMethods `json:"rtspAuthMethods"` - RTSPUDPReadBufferSize *uint `json:"rtspUDPReadBufferSize,omitempty"` // deprecated + RTSPUDPReadBufferSize *uint `json:"rtspUDPReadBufferSize,omitempty" deprecated:"true"` // RTMP server RTMP bool `json:"rtmp"` - RTMPDisable *bool `json:"rtmpDisable,omitempty"` // deprecated + RTMPDisable *bool `json:"rtmpDisable,omitempty" deprecated:"true"` RTMPEncryption Encryption `json:"rtmpEncryption"` RTMPAddress string `json:"rtmpAddress"` RTMPSAddress string `json:"rtmpsAddress"` @@ -349,12 +349,12 @@ type Conf struct { // HLS server HLS bool `json:"hls"` - HLSDisable *bool `json:"hlsDisable,omitempty"` // deprecated + HLSDisable *bool `json:"hlsDisable,omitempty" deprecated:"true"` HLSAddress string `json:"hlsAddress"` HLSEncryption bool `json:"hlsEncryption"` HLSServerKey string `json:"hlsServerKey"` HLSServerCert string `json:"hlsServerCert"` - HLSAllowOrigin *string `json:"hlsAllowOrigin,omitempty"` // deprecated + HLSAllowOrigin *string `json:"hlsAllowOrigin,omitempty" deprecated:"true"` HLSAllowOrigins []string `json:"hlsAllowOrigins"` HLSTrustedProxies IPNetworks `json:"hlsTrustedProxies"` HLSAlwaysRemux bool `json:"hlsAlwaysRemux"` @@ -368,12 +368,12 @@ type Conf struct { // WebRTC server WebRTC bool `json:"webrtc"` - WebRTCDisable *bool `json:"webrtcDisable,omitempty"` // deprecated + WebRTCDisable *bool `json:"webrtcDisable,omitempty" deprecated:"true"` WebRTCAddress string `json:"webrtcAddress"` WebRTCEncryption bool `json:"webrtcEncryption"` WebRTCServerKey string `json:"webrtcServerKey"` WebRTCServerCert string `json:"webrtcServerCert"` - WebRTCAllowOrigin *string `json:"webrtcAllowOrigin,omitempty"` // deprecated + WebRTCAllowOrigin *string `json:"webrtcAllowOrigin,omitempty" deprecated:"true"` WebRTCAllowOrigins []string `json:"webrtcAllowOrigins"` WebRTCTrustedProxies IPNetworks `json:"webrtcTrustedProxies"` WebRTCLocalUDPAddress string `json:"webrtcLocalUDPAddress"` @@ -385,22 +385,22 @@ type Conf struct { WebRTCSTUNGatherTimeout Duration `json:"webrtcSTUNGatherTimeout"` WebRTCHandshakeTimeout Duration `json:"webrtcHandshakeTimeout"` WebRTCTrackGatherTimeout Duration `json:"webrtcTrackGatherTimeout"` - WebRTCICEUDPMuxAddress *string `json:"webrtcICEUDPMuxAddress,omitempty"` // deprecated - WebRTCICETCPMuxAddress *string `json:"webrtcICETCPMuxAddress,omitempty"` // deprecated - WebRTCICEHostNAT1To1IPs *[]string `json:"webrtcICEHostNAT1To1IPs,omitempty"` // deprecated - WebRTCICEServers *[]string `json:"webrtcICEServers,omitempty"` // deprecated + WebRTCICEUDPMuxAddress *string `json:"webrtcICEUDPMuxAddress,omitempty" deprecated:"true"` + WebRTCICETCPMuxAddress *string `json:"webrtcICETCPMuxAddress,omitempty" deprecated:"true"` + WebRTCICEHostNAT1To1IPs *[]string `json:"webrtcICEHostNAT1To1IPs,omitempty" deprecated:"true"` + WebRTCICEServers *[]string `json:"webrtcICEServers,omitempty" deprecated:"true"` // SRT server SRT bool `json:"srt"` SRTAddress string `json:"srtAddress"` // Record (deprecated) - Record *bool `json:"record,omitempty"` // deprecated - RecordPath *string `json:"recordPath,omitempty"` // deprecated - RecordFormat *RecordFormat `json:"recordFormat,omitempty"` // deprecated - RecordPartDuration *Duration `json:"recordPartDuration,omitempty"` // deprecated - RecordSegmentDuration *Duration `json:"recordSegmentDuration,omitempty"` // deprecated - RecordDeleteAfter *Duration `json:"recordDeleteAfter,omitempty"` // deprecated + Record *bool `json:"record,omitempty" deprecated:"true"` + RecordPath *string `json:"recordPath,omitempty" deprecated:"true"` + RecordFormat *RecordFormat `json:"recordFormat,omitempty" deprecated:"true"` + RecordPartDuration *Duration `json:"recordPartDuration,omitempty" deprecated:"true"` + RecordSegmentDuration *Duration `json:"recordSegmentDuration,omitempty" deprecated:"true"` + RecordDeleteAfter *Duration `json:"recordDeleteAfter,omitempty" deprecated:"true"` // Path defaults PathDefaults Path `json:"pathDefaults"` diff --git a/internal/conf/path.go b/internal/conf/path.go index cca311af..fb652c8d 100644 --- a/internal/conf/path.go +++ b/internal/conf/path.go @@ -180,7 +180,7 @@ type Path struct { SourceOnDemandCloseAfter Duration `json:"sourceOnDemandCloseAfter"` MaxReaders int `json:"maxReaders"` SRTReadPassphrase string `json:"srtReadPassphrase"` - Fallback *string `json:"fallback,omitempty"` // deprecated + Fallback *string `json:"fallback,omitempty" deprecated:"true"` UseAbsoluteTimestamp bool `json:"useAbsoluteTimestamp"` // Always available @@ -190,7 +190,7 @@ type Path struct { // Record Record bool `json:"record"` - Playback *bool `json:"playback,omitempty"` // deprecated + Playback *bool `json:"playback,omitempty" deprecated:"true"` RecordPath string `json:"recordPath"` RecordFormat RecordFormat `json:"recordFormat"` RecordPartDuration Duration `json:"recordPartDuration"` @@ -199,34 +199,34 @@ type Path struct { RecordDeleteAfter Duration `json:"recordDeleteAfter"` // Authentication (deprecated) - PublishUser *Credential `json:"publishUser,omitempty"` // deprecated - PublishPass *Credential `json:"publishPass,omitempty"` // deprecated - PublishIPs *IPNetworks `json:"publishIPs,omitempty"` // deprecated - ReadUser *Credential `json:"readUser,omitempty"` // deprecated - ReadPass *Credential `json:"readPass,omitempty"` // deprecated - ReadIPs *IPNetworks `json:"readIPs,omitempty"` // deprecated + PublishUser *Credential `json:"publishUser,omitempty" deprecated:"true"` + PublishPass *Credential `json:"publishPass,omitempty" deprecated:"true"` + PublishIPs *IPNetworks `json:"publishIPs,omitempty" deprecated:"true"` + ReadUser *Credential `json:"readUser,omitempty" deprecated:"true"` + ReadPass *Credential `json:"readPass,omitempty" deprecated:"true"` + ReadIPs *IPNetworks `json:"readIPs,omitempty" deprecated:"true"` // Publisher source OverridePublisher bool `json:"overridePublisher"` - DisablePublisherOverride *bool `json:"disablePublisherOverride,omitempty"` // deprecated + DisablePublisherOverride *bool `json:"disablePublisherOverride,omitempty" deprecated:"true"` SRTPublishPassphrase string `json:"srtPublishPassphrase"` // RTSP source RTSPTransport RTSPTransport `json:"rtspTransport"` RTSPAnyPort bool `json:"rtspAnyPort"` - SourceProtocol *RTSPTransport `json:"sourceProtocol,omitempty"` // deprecated - SourceAnyPortEnable *bool `json:"sourceAnyPortEnable,omitempty"` // deprecated + SourceProtocol *RTSPTransport `json:"sourceProtocol,omitempty" deprecated:"true"` + SourceAnyPortEnable *bool `json:"sourceAnyPortEnable,omitempty" deprecated:"true"` RTSPRangeType RTSPRangeType `json:"rtspRangeType"` RTSPRangeStart string `json:"rtspRangeStart"` - RTSPUDPReadBufferSize *uint `json:"rtspUDPReadBufferSize,omitempty"` // deprecated + RTSPUDPReadBufferSize *uint `json:"rtspUDPReadBufferSize,omitempty" deprecated:"true"` RTSPUDPSourcePortRange []uint `json:"rtspUDPSourcePortRange"` // MPEG-TS source - MPEGTSUDPReadBufferSize *uint `json:"mpegtsUDPReadBufferSize,omitempty"` // deprecated + MPEGTSUDPReadBufferSize *uint `json:"mpegtsUDPReadBufferSize,omitempty" deprecated:"true"` // RTP source RTPSDP string `json:"rtpSDP"` - RTPUDPReadBufferSize *uint `json:"rtpUDPReadBufferSize,omitempty"` // deprecated + RTPUDPReadBufferSize *uint `json:"rtpUDPReadBufferSize,omitempty" deprecated:"true"` // WHEP source WHEPBearerToken string `json:"whepBearerToken"` @@ -272,13 +272,13 @@ type Path struct { RPICameraCodec string `json:"rpiCameraCodec"` RPICameraIDRPeriod uint `json:"rpiCameraIDRPeriod"` RPICameraBitrate uint `json:"rpiCameraBitrate"` - RPICameraProfile *string `json:"rpiCameraProfile,omitempty"` // deprecated - RPICameraLevel *string `json:"rpiCameraLevel,omitempty"` // deprecated + RPICameraProfile *string `json:"rpiCameraProfile,omitempty" deprecated:"true"` + RPICameraLevel *string `json:"rpiCameraLevel,omitempty" deprecated:"true"` RPICameraHardwareH264Profile string `json:"rpiCameraHardwareH264Profile"` RPICameraHardwareH264Level string `json:"rpiCameraHardwareH264Level"` RPICameraSoftwareH264Profile string `json:"rpiCameraSoftwareH264Profile"` RPICameraSoftwareH264Level string `json:"rpiCameraSoftwareH264Level"` - RPICameraJPEGQuality *uint `json:"rpiCameraJPEGQuality,omitempty"` // deprecated + RPICameraJPEGQuality *uint `json:"rpiCameraJPEGQuality,omitempty" deprecated:"true"` RPICameraMJPEGQuality uint `json:"rpiCameraMJPEGQuality"` RPICameraPrimaryName string `json:"-"` // filled by Validate() RPICameraSecondaryWidth uint `json:"-"` // filled by Validate() diff --git a/internal/defs/api.go b/internal/defs/api.go index a0f153d2..35294d3c 100644 --- a/internal/defs/api.go +++ b/internal/defs/api.go @@ -90,8 +90,8 @@ type APIPathReader struct { type APIPath struct { Name string `json:"name"` ConfName string `json:"confName"` - Ready bool `json:"ready"` // deprecated - ReadyTime *time.Time `json:"readyTime"` // deprecated + Ready bool `json:"ready" deprecated:"true"` + ReadyTime *time.Time `json:"readyTime" deprecated:"true"` Available bool `json:"available"` AvailableTime *time.Time `json:"availableTime"` Online bool `json:"online"` diff --git a/internal/linters/go2api/go2api_test.go b/internal/linters/go2api/go2api_test.go index c9dfd833..0320d413 100644 --- a/internal/linters/go2api/go2api_test.go +++ b/internal/linters/go2api/go2api_test.go @@ -17,11 +17,12 @@ import ( ) type openAPIProperty struct { - Ref string `yaml:"$ref"` - Type string `yaml:"type"` - Format string `yaml:"format"` - Nullable bool `yaml:"nullable"` - Items *openAPIProperty `yaml:"items"` + Ref string `yaml:"$ref"` + Type string `yaml:"type"` + Format string `yaml:"format"` + Nullable bool `yaml:"nullable"` + Deprecated bool `yaml:"deprecated"` + Items *openAPIProperty `yaml:"items"` } type openAPISchema struct { @@ -35,17 +36,17 @@ type openAPI struct { } `yaml:"components"` } -func fillProperty(t *testing.T, rt reflect.Type, existing openAPIProperty) openAPIProperty { +func fillProperty(t *testing.T, rt reflect.Type) openAPIProperty { + if rt.Kind() == reflect.Pointer { + prop := fillProperty(t, rt.Elem()) + prop.Nullable = true + return prop + } + switch { case rt == reflect.TypeOf(""): return openAPIProperty{Type: "string"} - case rt == reflect.PointerTo(reflect.TypeOf("")): - return openAPIProperty{ - Type: "string", - Nullable: true, - } - case rt == reflect.TypeOf(int(0)): return openAPIProperty{Type: "integer", Format: "int64"} @@ -61,15 +62,9 @@ func fillProperty(t *testing.T, rt reflect.Type, existing openAPIProperty) openA case rt == reflect.TypeOf(false): return openAPIProperty{Type: "boolean"} - case rt == reflect.TypeOf(&time.Time{}): - return openAPIProperty{Type: "string", Nullable: true} - case rt == reflect.TypeOf(uuid.UUID{}): return openAPIProperty{Type: "string", Format: "uuid"} - case rt == reflect.PointerTo(reflect.TypeOf(uuid.UUID{})): - return openAPIProperty{Type: "string", Format: "uuid", Nullable: true} - case rt == reflect.TypeOf(time.Time{}) || rt == reflect.TypeOf(conf.Duration(0)) || rt == reflect.TypeOf(conf.IPNetwork{}) || @@ -110,13 +105,8 @@ func fillProperty(t *testing.T, rt reflect.Type, existing openAPIProperty) openA Ref: "#/components/schemas/" + schemaName, } - case rt.Kind() == reflect.Pointer && rt.Elem().Kind() == reflect.Struct: - prop := fillProperty(t, rt.Elem(), existing) - prop.Nullable = true - return prop - case rt.Kind() == reflect.Slice: - items := fillProperty(t, rt.Elem(), *existing.Items) + items := fillProperty(t, rt.Elem()) return openAPIProperty{ Type: "array", Items: &items, @@ -258,9 +248,14 @@ func TestGo2API(t *testing.T) { for i := range ty.NumField() { sf := ty.Field(i) js := sf.Tag.Get("json") + name, _, _ := strings.Cut(js, ",") + deprecated := sf.Tag.Get("deprecated") == "true" - if js != "-" && js != "paths" && js != "pathDefaults" && !strings.Contains(js, ",omitempty") { - content2.Properties[js] = fillProperty(t, sf.Type, content1.Properties[js]) + if name != "" && name != "-" && name != "paths" && name != "pathDefaults" && + (!strings.Contains(js, ",omitempty") || deprecated) { + prop := fillProperty(t, sf.Type) + prop.Deprecated = deprecated + content2.Properties[name] = prop } }