Skip to main content

API Reference

This page documents all public functions, types, and options in the Contract v2 package.

Main Package

Import: github.com/go-mizu/mizu/contract/v2

Functions

Register

Registers a Go interface implementation as a Contract service.
func Register[T any](impl T, opts ...Option) *RegisteredService
ParameterTypeDescription
Ttype parameterThe interface type that defines your API
implTYour implementation that satisfies the interface
opts...OptionOptional configuration
Returns: *RegisteredService for mounting on transports. Example:
// todo/api.go - Your interface is defined in a package
// type API interface {
//     Create(ctx context.Context, in *CreateInput) (*Todo, error)
//     List(ctx context.Context) (*ListOutput, error)
// }

impl := todo.NewService()
svc := contract.Register[todo.API](impl,
    contract.WithName("Todo"),
    contract.WithDefaultResource("todos"),
)

Types

RegisteredService

A registered service ready to be mounted on transports.
type RegisteredService struct {
    // ... internal fields
}
Methods:
MethodReturnsDescription
Descriptor()*ServiceDescriptorGet service metadata
Call(ctx, resource, method, input)(any, error)Invoke a method programmatically
NewInput(resource, method)(any, error)Create new input instance

ServiceDescriptor

Metadata about a registered service.
type ServiceDescriptor struct {
    Name        string      // Service name
    Description string      // Optional description
    Resources   []*Resource // All resources
    Types       []*TypeInfo // All discovered types
}

Resource

A group of related methods (e.g., “todos”).
type Resource struct {
    Name    string    // Resource name (e.g., "todos")
    Methods []*Method // Methods in this resource
}

Method

Metadata for a single method.
type Method struct {
    Name        string       // Method name (e.g., "create")
    Description string       // Optional description
    Input       *TypeInfo    // Input type (nil if no input)
    Output      *TypeInfo    // Output type (nil if no output)
    HTTP        *HTTPBinding // HTTP method and path
    Stream      StreamMode   // Streaming mode if any
}

TypeInfo

Information about a type used in the API.
type TypeInfo struct {
    Name   string         // Type name (e.g., "CreateInput")
    Kind   string         // Type kind (struct, slice, etc.)
    Schema map[string]any // JSON Schema
}

HTTPBinding

HTTP method and path for a method.
type HTTPBinding struct {
    Method string // HTTP method (GET, POST, etc.)
    Path   string // URL path pattern
}

Options

WithName

Sets the service name:
contract.WithName("Todo")

WithDescription

Sets the service description:
contract.WithDescription("Todo management API")

WithDefaultResource

Groups all methods under a resource name:
contract.WithDefaultResource("todos")

WithResource

Groups specific methods under a resource:
contract.WithResource("users", "CreateUser", "GetUser", "ListUsers")

WithMethodHTTP

Override HTTP binding for a method:
contract.WithMethodHTTP("Archive", "POST", "/todos/{id}/archive")

WithHTTP

Set HTTP bindings for multiple methods:
contract.WithHTTP(map[string]contract.HTTPBinding{
    "Create": {Method: "POST", Path: "/v1/todos"},
    "Get":    {Method: "GET", Path: "/v1/todos/{id}"},
})

WithDefaults

Set global defaults:
contract.WithDefaults(contract.Defaults{
    BaseURL: "https://api.example.com",
})

WithStreaming

Mark a method as streaming:
contract.WithStreaming("Chat", contract.StreamSSE)
Usage Example:
svc := contract.Register[TodoAPI](impl,
    contract.WithName("Todo"),
    contract.WithDescription("Manages todo items"),
    contract.WithDefaultResource("todos"),
)

REST Package

Import: github.com/go-mizu/mizu/contract/v2/transport/rest

Functions

Mount

Mounts REST endpoints on a router.
func Mount(router *mizu.Router, svc *contract.RegisteredService, opts ...Option)
ParameterTypeDescription
router*mizu.RouterMizu router
svc*RegisteredServiceRegistered service
opts...OptionOptional configuration
Endpoints created based on method names:
  • Create -> POST /{resource}
  • List -> GET /{resource}
  • Get -> GET /{resource}/{id}
  • Update -> PUT /{resource}/{id}
  • Delete -> DELETE /{resource}/{id}
Example:
rest.Mount(app.Router, svc)
// Creates: POST /todos, GET /todos, GET /todos/{id}, PUT /todos/{id}, DELETE /todos/{id}

NewHandler

Creates an HTTP handler for the service.
func NewHandler(svc *contract.RegisteredService, opts ...Option) http.Handler

Options

// Custom invoker (for middleware)
rest.WithInvoker(invoker)

// Custom path prefix
rest.WithPrefix("/api/v1")

JSON-RPC Package

Import: github.com/go-mizu/mizu/contract/v2/transport/jsonrpc

Functions

Mount

Mounts a JSON-RPC 2.0 endpoint.
func Mount(router *mizu.Router, path string, svc *contract.RegisteredService, opts ...Option)
ParameterTypeDescription
router*mizu.RouterMizu router
pathstringURL path for the endpoint
svc*RegisteredServiceRegistered service
opts...OptionOptional configuration
Example:
jsonrpc.Mount(app.Router, "/rpc", svc)
// Methods available as: todos.create, todos.list, todos.get, etc.

NewHandler

Creates a JSON-RPC HTTP handler.
func NewHandler(svc *contract.RegisteredService, opts ...Option) http.Handler

Options

// Custom invoker (for middleware)
jsonrpc.WithInvoker(invoker)

Types

Request

type Request struct {
    JSONRPC string          `json:"jsonrpc"`
    ID      any             `json:"id,omitempty"`
    Method  string          `json:"method"`
    Params  json.RawMessage `json:"params,omitempty"`
}

Response

type Response struct {
    JSONRPC string `json:"jsonrpc"`
    ID      any    `json:"id,omitempty"`
    Result  any    `json:"result,omitempty"`
    Error   *Error `json:"error,omitempty"`
}

Error

type Error struct {
    Code    int    `json:"code"`
    Message string `json:"message"`
    Data    any    `json:"data,omitempty"`
}

MCP Package

Import: github.com/go-mizu/mizu/contract/v2/transport/mcp

Functions

Mount

Mounts MCP endpoint.
func Mount(router *mizu.Router, path string, svc *contract.RegisteredService, opts ...Option)
Example:
mcp.Mount(app.Router, "/mcp", svc)

NewHandler

Creates an MCP HTTP handler.
func NewHandler(svc *contract.RegisteredService, opts ...Option) http.Handler

Options

// Server information
mcp.WithServerInfo(mcp.ServerInfo{
    Name:    "my-api",
    Version: "1.0.0",
})

// Instructions for AI
mcp.WithInstructions("Use these tools to manage todos.")

// Allowed CORS origins
mcp.WithAllowedOrigins("https://claude.ai")

// Custom invoker (for middleware)
mcp.WithInvoker(invoker)

Types

ServerInfo

type ServerInfo struct {
    Name    string `json:"name"`
    Version string `json:"version"`
}

OpenAPI Package

Import: github.com/go-mizu/mizu/contract/v2/transport/openapi

Functions

Mount

Mounts OpenAPI spec endpoint.
func Mount(router *mizu.Router, path string, svc *contract.RegisteredService)
Example:
openapi.Mount(app.Router, "/openapi.json", svc)

Generate

Generates OpenAPI document from service.
func Generate(svc *contract.RegisteredService) *Document

Error Types

Error

Contract error with code and message.
type Error struct {
    Code    ErrorCode      `json:"code"`
    Message string         `json:"message"`
    Details map[string]any `json:"details,omitempty"`
}
Methods:
MethodReturnsDescription
Error()stringError message (implements error)
HTTPStatus()intHTTP status code
JSONRPCCode()intJSON-RPC error code
Unwrap()errorWrapped cause
WithDetail(key, value)*ErrorAdd detail
WithDetails(map)*ErrorAdd multiple details
WithCause(err)*ErrorWrap underlying error

Error Constructors

Convenience functions for common errors:
contract.ErrNotFound(message string) *Error           // 404
contract.ErrInvalidArgument(message string) *Error    // 400
contract.ErrPermissionDenied(message string) *Error   // 403
contract.ErrUnauthenticated(message string) *Error    // 401
contract.ErrInternal(message string) *Error           // 500
contract.ErrAlreadyExists(message string) *Error      // 409
contract.ErrResourceExhausted(message string) *Error  // 429
contract.ErrUnimplemented(message string) *Error      // 501
contract.ErrUnavailable(message string) *Error        // 503
General constructors:
contract.NewError(code ErrorCode, message string) *Error
contract.Errorf(code ErrorCode, format string, args ...any) *Error

ErrorCode

All available error codes:
type ErrorCode string

const (
    ErrCodeOK                 ErrorCode = "OK"
    ErrCodeCanceled           ErrorCode = "CANCELED"
    ErrCodeUnknown            ErrorCode = "UNKNOWN"
    ErrCodeInvalidArgument    ErrorCode = "INVALID_ARGUMENT"
    ErrCodeDeadlineExceeded   ErrorCode = "DEADLINE_EXCEEDED"
    ErrCodeNotFound           ErrorCode = "NOT_FOUND"
    ErrCodeAlreadyExists      ErrorCode = "ALREADY_EXISTS"
    ErrCodePermissionDenied   ErrorCode = "PERMISSION_DENIED"
    ErrCodeResourceExhausted  ErrorCode = "RESOURCE_EXHAUSTED"
    ErrCodeFailedPrecondition ErrorCode = "FAILED_PRECONDITION"
    ErrCodeAborted            ErrorCode = "ABORTED"
    ErrCodeOutOfRange         ErrorCode = "OUT_OF_RANGE"
    ErrCodeUnimplemented      ErrorCode = "UNIMPLEMENTED"
    ErrCodeInternal           ErrorCode = "INTERNAL"
    ErrCodeUnavailable        ErrorCode = "UNAVAILABLE"
    ErrCodeDataLoss           ErrorCode = "DATA_LOSS"
    ErrCodeUnauthenticated    ErrorCode = "UNAUTHENTICATED"
)

Helper Functions

// Convert error to Contract error
contract.AsError(err error) *Error

// Convert HTTP status to error code
contract.HTTPStatusToErrorCode(status int) ErrorCode

Method Signatures

Contract recognizes these method patterns:

Pattern 1: Input and Output

func (s *Service) Create(ctx context.Context, in *CreateInput) (*Todo, error)

Pattern 2: Output Only

func (s *Service) List(ctx context.Context) (*ListOutput, error)

Pattern 3: Input Only

func (s *Service) Delete(ctx context.Context, in *DeleteInput) error

Pattern 4: Neither

func (s *Service) Health(ctx context.Context) error
Rules:
  • First parameter must be context.Context
  • Input (if any) must be a pointer to a struct
  • Last return value must be error
  • Output (if any) must be a pointer to a struct

Complete Example

This example shows a complete application using the recommended package-based organization:
// todo/types.go
package todo

type Todo struct {
    ID    string `json:"id"`
    Title string `json:"title"`
}

type CreateInput struct {
    Title string `json:"title"`
}

type GetInput struct {
    ID string `json:"id" path:"id"`
}

type DeleteInput struct {
    ID string `json:"id" path:"id"`
}

type ListOutput struct {
    Items []*Todo `json:"items"`
}
// todo/api.go
package todo

import "context"

// API defines the contract for todo operations
type API interface {
    Create(ctx context.Context, in *CreateInput) (*Todo, error)
    List(ctx context.Context) (*ListOutput, error)
    Get(ctx context.Context, in *GetInput) (*Todo, error)
    Delete(ctx context.Context, in *DeleteInput) error
}
// todo/service.go
package todo

import (
    "context"

    contract "github.com/go-mizu/mizu/contract/v2"
)

// Service implements todo.API
type Service struct{}

// Compile-time check
var _ API = (*Service)(nil)

func NewService() *Service {
    return &Service{}
}

func (s *Service) Create(ctx context.Context, in *CreateInput) (*Todo, error) {
    if in.Title == "" {
        return nil, contract.ErrInvalidArgument("title is required")
    }
    return &Todo{ID: "1", Title: in.Title}, nil
}

func (s *Service) List(ctx context.Context) (*ListOutput, error) {
    return &ListOutput{Items: []*Todo{}}, nil
}

func (s *Service) Get(ctx context.Context, in *GetInput) (*Todo, error) {
    return &Todo{ID: in.ID, Title: "Sample"}, nil
}

func (s *Service) Delete(ctx context.Context, in *DeleteInput) error {
    return nil
}
// main.go
package main

import (
    "github.com/go-mizu/mizu"
    contract "github.com/go-mizu/mizu/contract/v2"
    "github.com/go-mizu/mizu/contract/v2/transport/rest"
    "github.com/go-mizu/mizu/contract/v2/transport/jsonrpc"
    "github.com/go-mizu/mizu/contract/v2/transport/mcp"
    "github.com/go-mizu/mizu/contract/v2/transport/openapi"

    "yourapp/todo"
)

func main() {
    impl := todo.NewService()

    // Register
    svc := contract.Register[todo.API](impl,
        contract.WithName("Todo"),
        contract.WithDefaultResource("todos"),
    )

    // Create app
    app := mizu.New()

    // Mount transports
    rest.Mount(app.Router, svc)
    jsonrpc.Mount(app.Router, "/rpc", svc)
    mcp.Mount(app.Router, "/mcp", svc)
    openapi.Mount(app.Router, "/openapi.json", svc)

    app.Listen(":8080")
}

See Also