type Query {
    shippingMethods(options: ShippingMethodListOptions): ShippingMethodList!
    shippingMethod(id: ID!): ShippingMethod
    shippingEligibilityCheckers: [ConfigurableOperationDefinition!]!
    shippingCalculators: [ConfigurableOperationDefinition!]!
    fulfillmentHandlers: [ConfigurableOperationDefinition!]!
    testShippingMethod(input: TestShippingMethodInput!): TestShippingMethodResult!
    testEligibleShippingMethods(input: TestEligibleShippingMethodsInput!): [ShippingMethodQuote!]!
}

type Mutation {
    "Create a new ShippingMethod"
    createShippingMethod(input: CreateShippingMethodInput!): ShippingMethod!
    "Update an existing ShippingMethod"
    updateShippingMethod(input: UpdateShippingMethodInput!): ShippingMethod!
    "Delete a ShippingMethod"
    deleteShippingMethod(id: ID!): DeletionResponse!
    "Delete multiple ShippingMethods"
    deleteShippingMethods(ids: [ID!]!): [DeletionResponse!]!

    "Assigns ShippingMethods to the specified Channel"
    assignShippingMethodsToChannel(input: AssignShippingMethodsToChannelInput!): [ShippingMethod!]!

    "Removes ShippingMethods from the specified Channel"
    removeShippingMethodsFromChannel(input: RemoveShippingMethodsFromChannelInput!): [ShippingMethod!]!
}

# generated by generateListOptions function
input ShippingMethodListOptions

input ShippingMethodTranslationInput {
    id: ID
    languageCode: LanguageCode!
    name: String
    description: String
}

input CreateShippingMethodInput {
    code: String!
    fulfillmentHandler: String!
    checker: ConfigurableOperationInput!
    calculator: ConfigurableOperationInput!
    translations: [ShippingMethodTranslationInput!]!
}

input UpdateShippingMethodInput {
    id: ID!
    code: String
    fulfillmentHandler: String
    checker: ConfigurableOperationInput
    calculator: ConfigurableOperationInput
    translations: [ShippingMethodTranslationInput!]!
}

input TestShippingMethodInput {
    checker: ConfigurableOperationInput!
    calculator: ConfigurableOperationInput!
    shippingAddress: CreateAddressInput!
    lines: [TestShippingMethodOrderLineInput!]!
}

input TestEligibleShippingMethodsInput {
    shippingAddress: CreateAddressInput!
    lines: [TestShippingMethodOrderLineInput!]!
}

input TestShippingMethodOrderLineInput {
    productVariantId: ID!
    quantity: Int!
}

type TestShippingMethodResult {
    eligible: Boolean!
    quote: TestShippingMethodQuote
}

type TestShippingMethodQuote {
    price: Money!
    priceWithTax: Money!
    metadata: JSON
}

input AssignShippingMethodsToChannelInput {
    shippingMethodIds: [ID!]!
    channelId: ID!
}

input RemoveShippingMethodsFromChannelInput {
    shippingMethodIds: [ID!]!
    channelId: ID!
}
