Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,9 @@ linters:
- linters:
- goconst
text: string `(Unix|unix|date|time|http-date|ipv6|String|DateTime|HTTPDate|Number)
- linters:
- goconst
text: string `(query)`
- linters: [revive]
text: avoid.+package names
paths:
Expand Down
20 changes: 20 additions & 0 deletions _testdata/positive/additional_operations.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
openapi: 3.2.0
info:
title: title
version: v0.1.0
paths:
/echo:
additionalOperations:
link:
operationId: echo
requestBody:
required: true
content:
text/plain:
schema: { type: string }
responses:
"200":
description: OK
content:
text/plain:
schema: { type: string }
26 changes: 26 additions & 0 deletions dsl.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package ogen

import (
"encoding/json"
"maps"
"slices"
"strings"

Expand Down Expand Up @@ -443,6 +444,31 @@ func (p *PathItem) SetTrace(o *Operation) *PathItem {
return p
}

// SetQuery sets the Query of the PathItem.
func (p *PathItem) SetQuery(o *Operation) *PathItem {
p.Query = o
return p
}

// SetAdditionalOperations sets the AdditionalOperations of the PathItem.
func (p *PathItem) SetAdditionalOperations(ops map[string]*Operation) *PathItem {
p.AdditionalOperations = maps.Clone(ops)
return p
}

// SetAdditionalOperation sets a single operation in the AdditionalOperations of the PathItem.
func (p *PathItem) SetAdditionalOperation(method string, o *Operation) *PathItem {
p.initAdditionalOperations()
p.AdditionalOperations[method] = o
return p
}

func (p *PathItem) initAdditionalOperations() {
if p.AdditionalOperations == nil {
p.AdditionalOperations = make(map[string]*Operation)
}
}

// SetServers sets the Servers of the PathItem.
func (p *PathItem) SetServers(srvs []Server) *PathItem {
p.Servers = slices.Clone(srvs)
Expand Down
8 changes: 8 additions & 0 deletions dsl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,9 @@ func TestBuilder(t *testing.T) {
SetHead(ogen.NewOperation().SetOperationID("head").SetResponses(ogen.Responses{"resp": ogen.NewResponse()})).
SetPatch(ogen.NewOperation().SetOperationID("patch").AddParameters(ogen.NewParameter().InHeader().SetDeprecated(true))).
SetTrace(ogen.NewOperation().SetOperationID("trace")).
SetQuery(ogen.NewOperation().SetOperationID("query")).
SetAdditionalOperations(map[string]*ogen.Operation{"LINK": ogen.NewOperation().SetOperationID("link")}).
SetAdditionalOperation("UNLINK", ogen.NewOperation().SetOperationID("unlink")).
SetServers([]ogen.Server{{"url1", "desc1", nil, _common}}).
AddServers(ogen.NewServer().SetDescription("desc2").SetURL("url2")).
SetParameters([]*ogen.Parameter{_queryParam.Parameter})
Expand All @@ -344,6 +347,11 @@ func TestBuilder(t *testing.T) {
Head: &ogen.Operation{OperationID: "head", Responses: ogen.Responses{"resp": &ogen.Response{}}},
Patch: &ogen.Operation{OperationID: "patch", Parameters: []*ogen.Parameter{{In: "header", Deprecated: true}}},
Trace: &ogen.Operation{OperationID: "trace"},
Query: &ogen.Operation{OperationID: "query"},
AdditionalOperations: map[string]*ogen.Operation{
"LINK": {OperationID: "link"},
"UNLINK": {OperationID: "unlink"},
},
Servers: []ogen.Server{
{"url1", "desc1", nil, _common},
{"url2", "desc2", nil, _common},
Expand Down
2 changes: 1 addition & 1 deletion gen/ir/json.go
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ func (j JSON) Format() string {
return typePrefix("UnixMicro")
case "unix-milli":
return typePrefix("UnixMilli")
case "decimal": //nolint:goconst // This whole switch is duplicated in NamePostfix. Should create a common helper.
case "decimal":
return typePrefix("Decimal")
default:
return ""
Expand Down
54 changes: 54 additions & 0 deletions internal/integration/additional_operations_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package integration

import (
"context"
"io"
"net/http"
"net/http/httptest"
"strings"
"testing"

"github.com/stretchr/testify/require"

api "github.com/ogen-go/ogen/internal/integration/test_additional_operations"
)

type additionalOperationsTestServer struct {
api.UnimplementedHandler
}

func (s *additionalOperationsTestServer) Echo(ctx context.Context, req api.EchoReq) (r api.EchoOK, err error) {
return api.EchoOK{Data: req}, nil
}

func TestAdditionalOperations(t *testing.T) {
srv, err := api.NewServer(&additionalOperationsTestServer{})
require.NoError(t, err)

s := httptest.NewServer(srv)
defer s.Close()

const text = "Hello, 世界"

req, err := http.NewRequest("LINK", s.URL+"/echo", strings.NewReader(text))
require.NoError(t, err)
req.Header.Set("Content-Type", "text/plain")

resp, err := s.Client().Do(req)
require.NoError(t, err)

respText, err := io.ReadAll(resp.Body)
require.NoError(t, err)
require.NoError(t, resp.Body.Close())
require.Equal(t, text, string(respText))
require.Equal(t, http.StatusOK, resp.StatusCode)

client, err := api.NewClient(s.URL)
require.NoError(t, err)

resp2, err := client.Echo(t.Context(), api.EchoReq{Data: strings.NewReader(text)})
require.NoError(t, err)
resp2Text, err := io.ReadAll(resp2)
require.NoError(t, err)
require.Equal(t, text, string(resp2Text))
}
1 change: 1 addition & 0 deletions internal/integration/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ package integration
//go:generate go run ../../cmd/ogen -v --clean --target test_value_based_discrimination ../../_testdata/positive/value_based_discrimination.json
//go:generate go run ../../cmd/ogen -v --clean --config _config/additionalPropertiesPatternProperties.yml --target test_additionalpropertiespatternproperties ../../_testdata/positive/additionalPropertiesPatternProperties.yml
//go:generate go run ../../cmd/ogen -v --clean --config _config/client_options.yml --target test_client_options ../../_testdata/positive/client_options.json
//go:generate go run ../../cmd/ogen -v --clean --target test_additional_operations ../../_testdata/positive/additional_operations.yml
//
//go:generate go run ../../cmd/ogen -v --clean -target test_enum_naming ../../_testdata/positive/enum_naming.yml
//go:generate go run ../../cmd/ogen -v --clean -target test_naming_extensions ../../_testdata/positive/naming_extensions.json
Expand Down
Loading
Loading