goql is a GraphQL client package written in Go. with built-in two-way marshaling support via struct tags.

goql

Go Reference CircleCI Generated via Bootstrap

goql is a GraphQL client library with built-in two-way marshaling support via struct tags. This is key because it allows for strongly typed GraphQL queries as opposed to variables containing a string representation of the query. This also facilitates more advanced features, such as sparse field sets.

For complete documentation see the generated pkg.go documentation. For a complete guide on the struct tag syntax, see the documentation found below under Defining GraphQL Operations.

Installation

In the root of your project repository (same directory as your go.mod and go.sum files):

go get github.com/getoutreach/goql

After that you should be able to import it anywhere within your project.

Defining GraphQL Operations

GraphQL operations can be defined by using normal Go struct types along with the help of struct tags. For example:

,sort:$sort<[String]>,size:$size,before:$before,after:$after)"` } ">
type QueryUserCollection struct {
	UserCollection struct {
		Collection []struct {
			ID   string
			Name string
		} `goql:"keep"`
	} `goql:"userCollection(filter:$filter<[Filter]>,sort:$sort<[String]>,size:$size,before:$before,after:$after)"`
}

when passed through the GraphQL query marshaller renders the following string:

query($filter: [Filter], $sort: [String], $size: Int, $before: String, $after: String) {
    userCollection(filter: $filter, sort: $sort, size: $size, before: $before, after: $after) {
        collection {
            id
            name
        }
    }
}

Here's the high-level steps to go through when first defining a GraphQL operation:

  1. Create a struct that will act as a wrapper for the entire operation. The top-level model will be the only immediate child struct field of this wrapper struct (e.g. QueryUserCollection's only immediate child is UserCollection which together represents the query($filter: [Filter], ...) { userCollection(filter: $filter, ...) { ... } } part of the output).
  2. Define all of the fields and sub-models of the top-level model as struct fields within the top-level model (e.g. UserCollection contains children fields []Collection, ID, and Name). All types should match the types described in the schema of the query.
    • ID in GraphQL is a string in Go.
    • Any type with the non-null (!) restriction in GraphQL should be a non-pointer type in Go. Conversely, any type in GraphQL without this restriction should be nullable (a pointer type) in Go.
    • If the field is an integral part of the operation, e.g. UserCollection, and Collection fields in the struct above, add the goql:"keep" tag to them to tell the marshaler to always include these fields. This is necessary in order for sparse field sets to work. However, in the example above the keep tag can actually be omitted from the UserCollection part of the query as it already defines an operation declaration, which the marshaler already sees as an integral part of the operation and implicitly marks it to be kept (that is why the keep tag is left off of that portion, but on Collection still).
  3. Iterate through the fields and add goql struct tags to further define the structure of the operation by modifying declarations, adding aliases, variables, or directives to each field. See the immediately proceeding section, GraphQL Struct Tag Syntax, for more information on these struct tags and how to define them.

GraphQL Struct Tag Syntax

The following components can be used alone or together, separated by a comma within in the tag, to define a goql struct tag for a field or model on an operation:

  • modelName(arg:$var, arg2:$var2, ...)
    • Defines the name and argument list for a model. This is close to what you would see in a normal GraphQL operation, with a little syntactic sugar added to define the types of variables since they're needed in the wrapper of the operation when defining the variables used throughout it. This component implicitly defines the keep tag for the field as well, given that operation declarations are necessary regardless of sparse fieldset instructions.
    • MyModel struct `goql:"myModel(page:$page)"` -> query($page: Int!) { myModel(page: $page) { ...
  • fieldNameOverride
    • Overrides the name of a field, by default the lower camel-case version of the name of the struct field is used.
    • Name string `goql:"username"` -> username
  • @alias(desiredAlias)
    • Adds an alias for a field or model, which will change the returned key in the JSON response from the GraphQL server. See the GraphQL documentation on aliases for more information.
    • An alias is required when an operation name set by a goql tag diverges from the struct field name. Without an alias in that situation the data would not be able to be marshaled back into the struct field after the operation succeeds, resulting in a silent "error". As an example, Role *Role `goql:"createRole(...)"` would need an alias since createRole (operation name) != Role (struct field name).
    • Name string `goql:"@alias(username)"` -> username: name
  • @include($flag)
    • Adds an include directive to the field or model. See the GraphQL documentation on directives for more information. Note that the variable passed to this directive in the struct tag does not have a type proceeding it in square brackets. This is because these directive variables always have the type of Boolean!, so it is implied and therefore not necessary.
    • Name string `goql:"@include($withName)"` -> name @include(if: $withName)
  • @skip($flag)
    • Adds a skip directive to the field or model. See the GraphQL documentation on directives for more information. Note that the variable passed to this directive in the struct tag does not have a type proceeding it in square brackets. This is because these directive variables always have the type of Boolean!, so it is implied and therefore not necessary.
    • Name string `goql:"@skip($withoutName)"` -> name @skip(if: $withoutName)
  • keep
    • Tells the marshaler to keep this field regardless of what is requested in terms of sparse field sets.

Here is an example of using multiple struct tags together:

Name string `goql:"@alias(username),@include($withName)"` -> username: name @include(if: $withName)

Rules:

  • The same component cannot be defined more than once in a singular struct tag.
    • Name string `goql:"@include($withName),@include($withName2)"` would result in an error because an include directive was defined twice on the same struct tag.
  • All defined variables must only have one type each associated with them.
    • MyModel struct `goql:"myModel(page:$page,pageSize:$page)"` would result in an error, since $page is defined to have both the type of Int! and Int.
    • MyModel struct `goql:"myModel(page:$page),@include($page)"` would also result in an error, since $page is defined to have the type of both Int! and Boolean! (implicit when used in the include directive).
Owner
Outreach
The most flexible and powerful sales communication tool.
Outreach
Comments
  • fix: tokenize fields based on node level

    fix: tokenize fields based on node level

    What this PR does / why we need it

    Re-bootstrapping with a recent version flags a race condition when running tests:

     :: Running go test (or_test)
    
    
      60ms . ·······················↷·································✖✖✖✖✖✖
           graphql_test
    
     63 tests, 1 skipped, 6 failures in 8.945s
    
    === Skipped
    === SKIP: . TestDoCustom (0.00s)
        do_test.go:51:
    
    === Failed
    === FAIL: . TestCustomOperationWithHeaders (0.01s)
        testing.go:1152: race detected during execution of test
    
    === FAIL: . TestQuery (0.01s)
        testing.go:1152: race detected during execution of test
    
    === FAIL: . TestCustomOperation (0.01s)
        testing.go:1152: race detected during execution of test
    
    === FAIL: . TestQueryWithHeaders (0.01s)
        testing.go:1152: race detected during execution of test
    
    === FAIL: . TestMutate (0.01s)
        testing.go:1152: race detected during execution of test
    
    === FAIL: . TestMutateWithHeaders (0.01s)
        testing.go:1152: race detected during execution of test
    
    DONE 63 tests, 1 skipped, 6 failures in 8.963s
    make: *** [test] Error 1
    

    The issue occurs in the marshal method when multiple requests try to update the declaration name of the same cached operation https://github.com/getoutreach/goql/blob/6f72c1efa60eb971ac68dd8dbd602d133083d6e0/query.go#L636

    The proposed fix splits field tokenisation into different methods based on the level of the tree where the node is at. If the node is the root element, its declaration is not tokenised. Instead, the wrapper + args from tokens are passed to the writer. For the rest of the nodes, the tokenisation happens as usual.

    Jira ID

    N/A

    Notes for your reviewers

  • chore(deps): bump github.com/google/go-cmp from 0.5.5 to 0.5.6

    chore(deps): bump github.com/google/go-cmp from 0.5.5 to 0.5.6

    Bumps github.com/google/go-cmp from 0.5.5 to 0.5.6.

    Release notes

    Sourced from github.com/google/go-cmp's releases.

    v0.5.6

    Reporter changes:

    • (#258) Print as text if mostly text
    • (#259) Cleanup edit groups after coalescing
    • (#260) Avoid diffing by lines if inefficient

    Minor documentation changes:

    • (#256) Fix typo in path.go
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
  • feat(bootstrap): v10.2.1, fnd-dt

    feat(bootstrap): v10.2.1, fnd-dt

    What this PR does / why we need it

    This PR runs the latest bootstrap and changes the reporting team to fnd-dt to reflect and internal re-org.

    Jira ID

    [XX-XX]

    Notes for your reviewers

  • fix(bootstrap): v9.37.0

    fix(bootstrap): v9.37.0

    Runs bootstrap v9.37.0.

    Release Notes

    9.37.0 (2022-05-16)

    Features

    Bug Fixes

    Feedback? Run into bugs? Let us know at #dev-tooling-support!

  • chore(deps): bump github.com/google/go-cmp from 0.5.6 to 0.5.8

    chore(deps): bump github.com/google/go-cmp from 0.5.6 to 0.5.8

    Bumps github.com/google/go-cmp from 0.5.6 to 0.5.8.

    Release notes

    Sourced from github.com/google/go-cmp's releases.

    v0.5.8

    Reporter changes:

    • (#293) Fix printing of types in reporter output for interface and pointer types
    • (#294) Use string formatting for slice of bytes in more circumstances

    Dependency changes:

    • (#292) Update minimum supported version to go1.13 and remove xerrors dependency

    v0.5.7

    Reporter changes:

    • (#266) Fix textual printing of byte slices
    • (#275) Reduce minimum length for specialize string diffing
    • (#276) Use any alias instead of interface{}

    Code cleanup changes:

    • (#281) Update minimum supported version to go1.11
    • (#282) Drop hacks to work around Go reflection bugs in Go1.9
    • (#285) Add //go:build lines
    • (#262) Fix staticcheck findings
    • (#263) Avoid shadowing variable
    • (#268) Use sha256 in test
    • (#271) Fix spelling mistakes
    • (#269) Change build status badge
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
  • chore(test): support error responses in test server

    chore(test): support error responses in test server

    What this PR does / why we need it

    apiproxy service needs to interpret flagship errors coming through giraffe in the extensions field of the graphql error type. This errors must be forwarded to comply with api v2 error definition. See more: https://outreach-io.atlassian.net/browse/VXP-4000

    The changes in this proposal add a new operation error that can be registered in the test server to respond with a graphql error with a custom extensions field. The value of the extensions interface is defined through the registered operation.

    Jira ID

    [ORES-1245](https://outreach-io.atlassian.net/browse/ORES-1245)

  • feat(bootstrap): v9.4.4

    feat(bootstrap): v9.4.4

    Runs bootstrap from v9.1.5 to v9.4.4.

    Release Notes

    v9.4.4

    9.4.4 (2022-02-18)

    Bug Fixes

    v9.4.3

    9.4.3 (2022-02-18)

    Bug Fixes

    • deps: dont include closed source deps in OSS repos (#1023) (7bfc7e9)

    v9.4.2

    9.4.2 (2022-02-18)

    Bug Fixes

    • devbase: v1.50.0 (setup_devenv, CI) (#1021) (fc9aca2)
    • kubernetes: set namespace on role and rolebinding (#1022) (8db5e6f)

    v9.4.1

    9.4.1 (2022-02-17)

    Bug Fixes

    v9.4.0

    9.4.0 (2022-02-17)

    Features

    v9.3.2

    9.3.2 (2022-02-17)

    Bug Fixes

    v9.3.1

    9.3.1 (2022-02-17)

    Bug Fixes

    • honeycombdataset comment (997c12b)

    v9.3.0

    9.3.0 (2022-02-17)

    Features

    • smartstore: Adding bootstrap files for cdc (#996) (46e6991)
    • smartstore: Adding bootstrap files for cdc (#981) (e7c8262)

    Bug Fixes

    v9.2.1

    9.2.1 (2022-02-16)

    Bug Fixes

    v9.2.0

    9.2.0 (2022-02-16)

    Features

    .... truncated

    Metadata
    • JIRA Compliance: DT-0
    • Pod: reactor-worker-dc54f777f-5qclz
    • WorkflowID: 5d7b3060-551d-4910-a4f1-8e0ffaa62e88

    Feedback? Run into bugs? Let us know at #dev-tooling-support!

  • feat(bootstrap): v8.38.0

    feat(bootstrap): v8.38.0

    Runs bootstrap from v8.35.0 to v8.38.0.

    Release Notes

    v8.38.0

    8.38.0 (2022-01-22)

    Features

    • postgresql: RDS certs to postgresql and user/role creation via temp flag (#937) (2dd0a44)

    v8.37.1

    8.37.1 (2022-01-21)

    Bug Fixes

    • enable a new version 1.13.3 of temporal (#945) (76c2b91)

    v8.37.0

    8.37.0 (2022-01-21)

    Features

    • Added temporal_cassandra resource type (#948) (91e21ec)

    Bug Fixes

    • k8s: fix doc gen if there are mult controllers (#938) (076ba97)

    v8.36.6

    8.36.6 (2022-01-20)

    Bug Fixes

    • add missing service.yaml keys used in protoc.sh (#952) (9860caa)
    • segments: skip ngb bentos in Concourse (additionalBentos) (#949) (0bc6d81)

    v8.36.5

    8.36.5 (2022-01-19)

    Bug Fixes

    • monitoring: pod CPU/memory high alerts need to ignore dev (#944) (af8dbbc)

    v8.36.4

    8.36.4 (2022-01-18)

    Bug Fixes

    v8.36.3

    8.36.3 (2022-01-18)

    Bug Fixes

    v8.36.2

    8.36.2 (2022-01-14)

    Bug Fixes

    • clerk: [DP-3097] Remove unnecessary code from the consumer tests (#935) (1382acc)

    v8.36.1

    8.36.1 (2022-01-14)

    Bug Fixes

    v8.36.0

    8.36.0 (2022-01-13)

    Features

    • DTSS-121: Adding CPU and Memory P2 monitors by default to services (#929) (2427c80)
    • stencil: run stencil after codegen (DTSS-1138) (#907) (e6b8214)

    Bug Fixes

    • concourse: only create entries for legacy bentos (DTSS-1151) (#932) (42643c0)
    Metadata
    • JIRA Compliance: DT-0
    • Pod: reactor-worker-664445c857-5qc8d
    • WorkflowID: 5de3904d-b928-452b-9950-5d8531232e1c

    Feedback? Run into bugs? Let us know at #dev-tooling-support!

  • chore(deps): bump github.com/google/go-cmp from 0.5.6 to 0.5.7

    chore(deps): bump github.com/google/go-cmp from 0.5.6 to 0.5.7

    Bumps github.com/google/go-cmp from 0.5.6 to 0.5.7.

    Release notes

    Sourced from github.com/google/go-cmp's releases.

    v0.5.7

    Reporter changes:

    • (#266) Fix textual printing of byte slices
    • (#275) Reduce minimum length for specialize string diffing
    • (#276) Use any alias instead of interface{}

    Code cleanup changes:

    • (#281) Update minimum supported version to go1.11
    • (#282) Drop hacks to work around Go reflection bugs in Go1.9
    • (#285) Add //go:build lines
    • (#262) Fix staticcheck findings
    • (#263) Avoid shadowing variable
    • (#268) Use sha256 in test
    • (#271) Fix spelling mistakes
    • (#269) Change build status badge
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
  • feat(bootstrap): v8.36.3

    feat(bootstrap): v8.36.3

    Runs bootstrap from v8.35.0 to v8.36.3.

    Release Notes

    v8.36.3

    8.36.3 (2022-01-18)

    Bug Fixes

    v8.36.2

    8.36.2 (2022-01-14)

    Bug Fixes

    • clerk: [DP-3097] Remove unnecessary code from the consumer tests (#935) (1382acc)

    v8.36.1

    8.36.1 (2022-01-14)

    Bug Fixes

    v8.36.0

    8.36.0 (2022-01-13)

    Features

    • DTSS-121: Adding CPU and Memory P2 monitors by default to services (#929) (2427c80)
    • stencil: run stencil after codegen (DTSS-1138) (#907) (e6b8214)

    Bug Fixes

    • concourse: only create entries for legacy bentos (DTSS-1151) (#932) (42643c0)

    v8.35.0

    8.35.0 (2022-01-11)

    Features

    • managedResources: PostgreSQL support (phase1) (#880) (304f758)
    Metadata
    • JIRA Compliance: DT-0
    • Pod: reactor-worker-664445c857-44gl4
    • WorkflowID: a87bfdc2-b231-40ba-9bb9-a221185bd408

    Feedback? Run into bugs? Let us know at #dev-tooling-support!

  • feat(bootstrap): v8.36.2

    feat(bootstrap): v8.36.2

    Runs bootstrap from v8.35.0 to v8.36.2.

    Release Notes

    v8.36.2

    8.36.2 (2022-01-14)

    Bug Fixes

    • clerk: [DP-3097] Remove unnecessary code from the consumer tests (#935) (1382acc)

    v8.36.1

    8.36.1 (2022-01-14)

    Bug Fixes

    v8.36.0

    8.36.0 (2022-01-13)

    Features

    • DTSS-121: Adding CPU and Memory P2 monitors by default to services (#929) (2427c80)
    • stencil: run stencil after codegen (DTSS-1138) (#907) (e6b8214)

    Bug Fixes

    • concourse: only create entries for legacy bentos (DTSS-1151) (#932) (42643c0)

    v8.35.0

    8.35.0 (2022-01-11)

    Features

    • managedResources: PostgreSQL support (phase1) (#880) (304f758)
    Metadata
    • JIRA Compliance: DT-0
    • Pod: reactor-worker-664445c857-tb262
    • WorkflowID: e3446195-bbc6-4f56-8550-14aa02e25449

    Feedback? Run into bugs? Let us know at #dev-tooling-support!

  • chore(deps): bump github.com/google/go-cmp from 0.5.7 to 0.5.9

    chore(deps): bump github.com/google/go-cmp from 0.5.7 to 0.5.9

    Bumps github.com/google/go-cmp from 0.5.7 to 0.5.9.

    Release notes

    Sourced from github.com/google/go-cmp's releases.

    v0.5.9

    Reporter changes:

    • (#299) Adjust heuristic for line-based versus byte-based diffing
    • (#306) Use value.TypeString in PathStep.String

    Code cleanup changes:

    • (#297) Use reflect.Value.IsZero
    • (#304) Format with Go 1.19 formatter
    • (#300 )Fix typo in Result documentation
    • (#302) Pre-declare global type variables
    • (#309) Run tests on Go 1.19

    v0.5.8

    Reporter changes:

    • (#293) Fix printing of types in reporter output for interface and pointer types
    • (#294) Use string formatting for slice of bytes in more circumstances

    Dependency changes:

    • (#292) Update minimum supported version to go1.13 and remove xerrors dependency
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
  • fix: prevent race condition when marshalling cached operations

    fix: prevent race condition when marshalling cached operations

    What this PR does / why we need it

    Re-bootstrapping with a recent version flags a race condition when running tests:

     :: Running go test (or_test)
    
    
      60ms . ·······················↷·································✖✖✖✖✖✖
           graphql_test
    
     63 tests, 1 skipped, 6 failures in 8.945s
    
    === Skipped
    === SKIP: . TestDoCustom (0.00s)
        do_test.go:51:
    
    === Failed
    === FAIL: . TestCustomOperationWithHeaders (0.01s)
        testing.go:1152: race detected during execution of test
    
    === FAIL: . TestQuery (0.01s)
        testing.go:1152: race detected during execution of test
    
    === FAIL: . TestCustomOperation (0.01s)
        testing.go:1152: race detected during execution of test
    
    === FAIL: . TestQueryWithHeaders (0.01s)
        testing.go:1152: race detected during execution of test
    
    === FAIL: . TestMutate (0.01s)
        testing.go:1152: race detected during execution of test
    
    === FAIL: . TestMutateWithHeaders (0.01s)
        testing.go:1152: race detected during execution of test
    
    DONE 63 tests, 1 skipped, 6 failures in 8.963s
    make: *** [test] Error 1
    

    The issue occurs in the marshal method when multiple requests try to update the declaration name of the same cached operation https://github.com/getoutreach/goql/blob/6f72c1efa60eb971ac68dd8dbd602d133083d6e0/query.go#L636

    The proposed fix copies the cached operation by value before it is updated. Since no other fields are updated during the marshalling process, there's no need make a deep copy (by reference).

    Jira ID

    N/A

    Notes for your reviewers

  • fix(bootstrap): v10.1.0

    fix(bootstrap): v10.1.0

  • missing full example

    missing full example

    hi,

    This package looks like a solid solution for creating type-safe graphql client code. Also I like that is has minimal dependencies (can we have even less?)

    For newcomers like me, it would help if the repository contained a full example demonstrating it usage.

  • Implement goql struct tag syntax for default variables

    Implement goql struct tag syntax for default variables

    This should be implemented in query.go and have relevant test cases in query_test.go. Here is some documentation on default variables from the GraphQL website - https://graphql.org/learn/queries/#default-variables

Simple web-hook based receiver executing things via HTTP request

Updater is a simple web-hook-based receiver executing things via HTTP requests and invoking remote updates without exposing any sensitive info, like ssh keys, passwords, etc.

Dec 19, 2022
retryablehttp package provides a familiar HTTP client interface with automatic retries and exponential backoff.

retryablehttp package provides a familiar HTTP client interface with automatic retries and exponential backoff.

Jan 4, 2023
Go library that makes it easy to add automatic retries to your projects, including support for context.Context.

go-retry Go library that makes it easy to add automatic retries to your projects, including support for context.Context. Example with context.Context

Aug 15, 2022
IceFireDB-Proxy - IceFireDB proxy, easier to use IceFireDB, support resp protocol
IceFireDB-Proxy - IceFireDB proxy, easier to use IceFireDB, support resp protocol

IceFireDB-Proxy IceFireDB-Proxy is a high-performance, highly available, and use

Jun 8, 2022
Full-featured, plugin-driven, extensible HTTP client toolkit for Go

gentleman Full-featured, plugin-driven, middleware-oriented toolkit to easily create rich, versatile and composable HTTP clients in Go. gentleman embr

Dec 23, 2022
An enhanced http client for Golang
An enhanced http client for Golang

go-http-client An enhanced http client for Golang Documentation on go.dev ?? This package provides you a http client package for your http requests. Y

Dec 23, 2022
An enhanced HTTP client for Go
An enhanced HTTP client for Go

Heimdall Description Installation Usage Making a simple GET request Creating a hystrix-like circuit breaker Creating a hystrix-like circuit breaker wi

Jan 9, 2023
Enriches the standard go http client with retry functionality.

httpRetry Enriches the standard go http client with retry functionality using a wrapper around the Roundtripper interface. The advantage of this libra

Dec 10, 2022
http client for golang
http client for golang

Request HTTP client for golang, Inspired by Javascript-axios Python-request. If you have experience about axios or requests, you will love it. No 3rd

Dec 18, 2022
Simple HTTP and REST client library for Go

Resty Simple HTTP and REST client library for Go (inspired by Ruby rest-client) Features section describes in detail about Resty capabilities Resty Co

Jan 1, 2023
A nicer interface for golang stdlib HTTP client

rq A nicer interface for golang stdlib HTTP client Documents rq: here client: here jar: here Why? Because golang HTTP client is a pain in the a... Fea

Dec 12, 2022
A Go HTTP client library for creating and sending API requests
A Go HTTP client library for creating and sending API requests

Sling Sling is a Go HTTP client library for creating and sending API requests. Slings store HTTP Request properties to simplify sending requests and d

Jan 7, 2023
a Go HTTP client with timeouts

go-httpclient requires Go 1.1+ as of v0.4.0 the API has been completely re-written for Go 1.1 (for a Go 1.0.x compatible release see 1adef50) Provides

Nov 10, 2022
GoRequest -- Simplified HTTP client ( inspired by nodejs SuperAgent )
GoRequest -- Simplified HTTP client ( inspired by nodejs SuperAgent )

GoRequest GoRequest -- Simplified HTTP client ( inspired by famous SuperAgent lib in Node.js ) "Shooting Requests like a Machine Gun" - Gopher Sending

Jan 1, 2023
Http client call for golang http api calls

httpclient-call-go This library is used to make http calls to different API services Install Package go get

Oct 7, 2022
gout to become the Swiss Army Knife of the http client @^^@---> gout 是http client领域的瑞士军刀,小巧,强大,犀利。具体用法可看文档,如使用迷惑或者API用得不爽都可提issues
gout to become the Swiss Army Knife of the http client @^^@--->  gout 是http client领域的瑞士军刀,小巧,强大,犀利。具体用法可看文档,如使用迷惑或者API用得不爽都可提issues

gout gout 是go写的http 客户端,为提高工作效率而开发 构架 feature 支持设置 GET/PUT/DELETE/PATH/HEAD/OPTIONS 支持设置请求 http header(可传 struct,map,array,slice 等类型) 支持设置 URL query(可

Dec 29, 2022
Retry, Race, All, Some, etc strategies for http.Client calls

reqstrategy Package reqstrategy provides functions for coordinating http.Client calls. It wraps typical call strategies like making simultaneous reque

Apr 30, 2021
An enhanced HTTP client for Go
An enhanced HTTP client for Go

Heimdall Description Installation Usage Making a simple GET request Creating a hystrix-like circuit breaker Creating a hystrix-like circuit breaker wi

Jan 2, 2023
fhttp is a fork of net/http that provides an array of features pertaining to the fingerprint of the golang http client.

fhttp The f stands for flex. fhttp is a fork of net/http that provides an array of features pertaining to the fingerprint of the golang http client. T

Jan 1, 2023