schema

package module
v0.0.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 9, 2020 License: GPL-3.0 Imports: 10 Imported by: 3

README

Phi Suite Schema.go

Homepage https://phisuite.com
GitHub https://github.com/phisuite

Overview

This project contains the Go module to create the Schema API server & client.
For more details, see Phi Suite Schema.

Installation

go get github.com/phisuite/schema.go

Creating the server

package main
import "github.com/phisuite/schema.go"

type eventAPIServer struct { ... }

func (s *eventAPIServer) Get(ctx context.Context, req *schema.Options) (*schema.Event, error) {
    ... 
}

lis, err := net.Listen("tcp", ":50051")
grpcServer := grpc.NewServer()
schema.RegisterEventAPIServer(grpcServer, &eventAPIServer{})
grpcServer.Serve(lis)

For more details, see gRPC Basics - Go: Creating the server.

Creating the client

package main
import "github.com/phisuite/schema.go"

conn, err := grpc.Dial(*serverAddr)
defer conn.Close()

client := schema.NewEventAPIClient(conn)
event := client.Get(context.Background(), &schema.Options{ ... })

For more details, see gRPC Basics - Go: Creating the client.

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	Status_name = map[int32]string{
		0: "UNACTIVATED",
		1: "ACTIVATED",
		2: "DEACTIVATED",
	}
	Status_value = map[string]int32{
		"UNACTIVATED": 0,
		"ACTIVATED":   1,
		"DEACTIVATED": 2,
	}
)

Enum value maps for Status.

View Source
var (
	Field_Type_name = map[int32]string{
		0:  "STRING",
		1:  "NUMBER",
		2:  "BOOLEAN",
		10: "FILE",
		11: "FOLDER",
		20: "EMAIL",
		21: "DATE",
		22: "TIME",
		23: "COLOR",
	}
	Field_Type_value = map[string]int32{
		"STRING":  0,
		"NUMBER":  1,
		"BOOLEAN": 2,
		"FILE":    10,
		"FOLDER":  11,
		"EMAIL":   20,
		"DATE":    21,
		"TIME":    22,
		"COLOR":   23,
	}
)

Enum value maps for Field_Type.

View Source
var (
	Field_Category_name = map[int32]string{
		0: "REQUIRED",
		1: "OPTIONAL",
	}
	Field_Category_value = map[string]int32{
		"REQUIRED": 0,
		"OPTIONAL": 1,
	}
)

Enum value maps for Field_Category.

View Source
var File_common_proto protoreflect.FileDescriptor
View Source
var File_entity_proto protoreflect.FileDescriptor
View Source
var File_event_proto protoreflect.FileDescriptor
View Source
var File_process_proto protoreflect.FileDescriptor

Functions

func RegisterEntityReadAPIServer added in v0.0.2

func RegisterEntityReadAPIServer(s *grpc.Server, srv EntityReadAPIServer)

func RegisterEntityWriteAPIServer added in v0.0.2

func RegisterEntityWriteAPIServer(s *grpc.Server, srv EntityWriteAPIServer)

func RegisterEventReadAPIServer added in v0.0.2

func RegisterEventReadAPIServer(s *grpc.Server, srv EventReadAPIServer)

func RegisterEventWriteAPIServer added in v0.0.2

func RegisterEventWriteAPIServer(s *grpc.Server, srv EventWriteAPIServer)

func RegisterProcessReadAPIServer added in v0.0.2

func RegisterProcessReadAPIServer(s *grpc.Server, srv ProcessReadAPIServer)

func RegisterProcessWriteAPIServer added in v0.0.2

func RegisterProcessWriteAPIServer(s *grpc.Server, srv ProcessWriteAPIServer)

Types

type Entity

type Entity struct {
	Name    string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Version string   `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
	Status  Status   `protobuf:"varint,3,opt,name=status,proto3,enum=schema.Status" json:"status,omitempty"`
	Data    []*Field `protobuf:"bytes,10,rep,name=data,proto3" json:"data,omitempty"`
	// contains filtered or unexported fields
}

func (*Entity) Descriptor deprecated

func (*Entity) Descriptor() ([]byte, []int)

Deprecated: Use Entity.ProtoReflect.Descriptor instead.

func (*Entity) GetData

func (x *Entity) GetData() []*Field

func (*Entity) GetName

func (x *Entity) GetName() string

func (*Entity) GetStatus

func (x *Entity) GetStatus() Status

func (*Entity) GetVersion

func (x *Entity) GetVersion() string

func (*Entity) ProtoMessage

func (*Entity) ProtoMessage()

func (*Entity) ProtoReflect added in v0.0.3

func (x *Entity) ProtoReflect() protoreflect.Message

func (*Entity) Reset

func (x *Entity) Reset()

func (*Entity) String

func (x *Entity) String() string

type EntityReadAPIClient added in v0.0.2

type EntityReadAPIClient interface {
	List(ctx context.Context, in *Options, opts ...grpc.CallOption) (EntityReadAPI_ListClient, error)
	Get(ctx context.Context, in *Options, opts ...grpc.CallOption) (*Entity, error)
}

EntityReadAPIClient is the client API for EntityReadAPI service.

For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.

func NewEntityReadAPIClient added in v0.0.2

func NewEntityReadAPIClient(cc grpc.ClientConnInterface) EntityReadAPIClient

type EntityReadAPIServer added in v0.0.2

type EntityReadAPIServer interface {
	List(*Options, EntityReadAPI_ListServer) error
	Get(context.Context, *Options) (*Entity, error)
}

EntityReadAPIServer is the server API for EntityReadAPI service.

type EntityReadAPI_ListClient added in v0.0.2

type EntityReadAPI_ListClient interface {
	Recv() (*Entity, error)
	grpc.ClientStream
}

type EntityReadAPI_ListServer added in v0.0.2

type EntityReadAPI_ListServer interface {
	Send(*Entity) error
	grpc.ServerStream
}

type EntityWriteAPIClient added in v0.0.2

type EntityWriteAPIClient interface {
	Create(ctx context.Context, in *Entity, opts ...grpc.CallOption) (*Entity, error)
	Update(ctx context.Context, in *Entity, opts ...grpc.CallOption) (*Entity, error)
	Activate(ctx context.Context, in *Options, opts ...grpc.CallOption) (*Entity, error)
	Deactivate(ctx context.Context, in *Options, opts ...grpc.CallOption) (*Entity, error)
}

EntityWriteAPIClient is the client API for EntityWriteAPI service.

For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.

func NewEntityWriteAPIClient added in v0.0.2

func NewEntityWriteAPIClient(cc grpc.ClientConnInterface) EntityWriteAPIClient

type EntityWriteAPIServer added in v0.0.2

type EntityWriteAPIServer interface {
	Create(context.Context, *Entity) (*Entity, error)
	Update(context.Context, *Entity) (*Entity, error)
	Activate(context.Context, *Options) (*Entity, error)
	Deactivate(context.Context, *Options) (*Entity, error)
}

EntityWriteAPIServer is the server API for EntityWriteAPI service.

type Event

type Event struct {
	Name    string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Version string   `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
	Status  Status   `protobuf:"varint,3,opt,name=status,proto3,enum=schema.Status" json:"status,omitempty"`
	Payload []*Field `protobuf:"bytes,10,rep,name=payload,proto3" json:"payload,omitempty"`
	// contains filtered or unexported fields
}

func (*Event) Descriptor deprecated

func (*Event) Descriptor() ([]byte, []int)

Deprecated: Use Event.ProtoReflect.Descriptor instead.

func (*Event) GetName

func (x *Event) GetName() string

func (*Event) GetPayload

func (x *Event) GetPayload() []*Field

func (*Event) GetStatus

func (x *Event) GetStatus() Status

func (*Event) GetVersion

func (x *Event) GetVersion() string

func (*Event) ProtoMessage

func (*Event) ProtoMessage()

func (*Event) ProtoReflect added in v0.0.3

func (x *Event) ProtoReflect() protoreflect.Message

func (*Event) Reset

func (x *Event) Reset()

func (*Event) String

func (x *Event) String() string

type EventReadAPIClient added in v0.0.2

type EventReadAPIClient interface {
	List(ctx context.Context, in *Options, opts ...grpc.CallOption) (EventReadAPI_ListClient, error)
	Get(ctx context.Context, in *Options, opts ...grpc.CallOption) (*Event, error)
}

EventReadAPIClient is the client API for EventReadAPI service.

For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.

func NewEventReadAPIClient added in v0.0.2

func NewEventReadAPIClient(cc grpc.ClientConnInterface) EventReadAPIClient

type EventReadAPIServer added in v0.0.2

type EventReadAPIServer interface {
	List(*Options, EventReadAPI_ListServer) error
	Get(context.Context, *Options) (*Event, error)
}

EventReadAPIServer is the server API for EventReadAPI service.

type EventReadAPI_ListClient added in v0.0.2

type EventReadAPI_ListClient interface {
	Recv() (*Event, error)
	grpc.ClientStream
}

type EventReadAPI_ListServer added in v0.0.2

type EventReadAPI_ListServer interface {
	Send(*Event) error
	grpc.ServerStream
}

type EventWriteAPIClient added in v0.0.2

type EventWriteAPIClient interface {
	Create(ctx context.Context, in *Event, opts ...grpc.CallOption) (*Event, error)
	Update(ctx context.Context, in *Event, opts ...grpc.CallOption) (*Event, error)
	Activate(ctx context.Context, in *Options, opts ...grpc.CallOption) (*Event, error)
	Deactivate(ctx context.Context, in *Options, opts ...grpc.CallOption) (*Event, error)
}

EventWriteAPIClient is the client API for EventWriteAPI service.

For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.

func NewEventWriteAPIClient added in v0.0.2

func NewEventWriteAPIClient(cc grpc.ClientConnInterface) EventWriteAPIClient

type EventWriteAPIServer added in v0.0.2

type EventWriteAPIServer interface {
	Create(context.Context, *Event) (*Event, error)
	Update(context.Context, *Event) (*Event, error)
	Activate(context.Context, *Options) (*Event, error)
	Deactivate(context.Context, *Options) (*Event, error)
}

EventWriteAPIServer is the server API for EventWriteAPI service.

type Field

type Field struct {
	Name     string         `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Type     Field_Type     `protobuf:"varint,2,opt,name=type,proto3,enum=schema.Field_Type" json:"type,omitempty"`
	Category Field_Category `protobuf:"varint,3,opt,name=category,proto3,enum=schema.Field_Category" json:"category,omitempty"`
	// contains filtered or unexported fields
}

func (*Field) Descriptor deprecated

func (*Field) Descriptor() ([]byte, []int)

Deprecated: Use Field.ProtoReflect.Descriptor instead.

func (*Field) GetCategory added in v0.0.2

func (x *Field) GetCategory() Field_Category

func (*Field) GetName

func (x *Field) GetName() string

func (*Field) GetType

func (x *Field) GetType() Field_Type

func (*Field) ProtoMessage

func (*Field) ProtoMessage()

func (*Field) ProtoReflect added in v0.0.3

func (x *Field) ProtoReflect() protoreflect.Message

func (*Field) Reset

func (x *Field) Reset()

func (*Field) String

func (x *Field) String() string

type Field_Category added in v0.0.2

type Field_Category int32
const (
	Field_REQUIRED Field_Category = 0
	Field_OPTIONAL Field_Category = 1
)

func (Field_Category) Descriptor added in v0.0.3

func (Field_Category) Enum added in v0.0.3

func (x Field_Category) Enum() *Field_Category

func (Field_Category) EnumDescriptor deprecated added in v0.0.2

func (Field_Category) EnumDescriptor() ([]byte, []int)

Deprecated: Use Field_Category.Descriptor instead.

func (Field_Category) Number added in v0.0.3

func (Field_Category) String added in v0.0.2

func (x Field_Category) String() string

func (Field_Category) Type added in v0.0.3

type Field_Type

type Field_Type int32
const (
	Field_STRING  Field_Type = 0
	Field_NUMBER  Field_Type = 1
	Field_BOOLEAN Field_Type = 2
	Field_FILE    Field_Type = 10
	Field_FOLDER  Field_Type = 11
	Field_EMAIL   Field_Type = 20
	Field_DATE    Field_Type = 21
	Field_TIME    Field_Type = 22
	Field_COLOR   Field_Type = 23
)

func (Field_Type) Descriptor added in v0.0.3

func (Field_Type) Descriptor() protoreflect.EnumDescriptor

func (Field_Type) Enum added in v0.0.3

func (x Field_Type) Enum() *Field_Type

func (Field_Type) EnumDescriptor deprecated

func (Field_Type) EnumDescriptor() ([]byte, []int)

Deprecated: Use Field_Type.Descriptor instead.

func (Field_Type) Number added in v0.0.3

func (x Field_Type) Number() protoreflect.EnumNumber

func (Field_Type) String

func (x Field_Type) String() string

func (Field_Type) Type added in v0.0.3

type Options

type Options struct {
	Name    string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
	Status  Status `protobuf:"varint,3,opt,name=status,proto3,enum=schema.Status" json:"status,omitempty"`
	Skip    uint32 `protobuf:"varint,10,opt,name=skip,proto3" json:"skip,omitempty"`
	Limit   uint32 `protobuf:"varint,11,opt,name=limit,proto3" json:"limit,omitempty"`
	// contains filtered or unexported fields
}

func (*Options) Descriptor deprecated

func (*Options) Descriptor() ([]byte, []int)

Deprecated: Use Options.ProtoReflect.Descriptor instead.

func (*Options) GetLimit added in v0.0.3

func (x *Options) GetLimit() uint32

func (*Options) GetName

func (x *Options) GetName() string

func (*Options) GetSkip added in v0.0.3

func (x *Options) GetSkip() uint32

func (*Options) GetStatus

func (x *Options) GetStatus() Status

func (*Options) GetVersion

func (x *Options) GetVersion() string

func (*Options) ProtoMessage

func (*Options) ProtoMessage()

func (*Options) ProtoReflect added in v0.0.3

func (x *Options) ProtoReflect() protoreflect.Message

func (*Options) Reset

func (x *Options) Reset()

func (*Options) String

func (x *Options) String() string

type Process

type Process struct {
	Name       string              `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Version    string              `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
	Status     Status              `protobuf:"varint,3,opt,name=status,proto3,enum=schema.Status" json:"status,omitempty"`
	Definition *Process_Definition `protobuf:"bytes,10,opt,name=definition,proto3" json:"definition,omitempty"`
	// contains filtered or unexported fields
}

func (*Process) Descriptor deprecated

func (*Process) Descriptor() ([]byte, []int)

Deprecated: Use Process.ProtoReflect.Descriptor instead.

func (*Process) GetDefinition added in v0.0.2

func (x *Process) GetDefinition() *Process_Definition

func (*Process) GetName

func (x *Process) GetName() string

func (*Process) GetStatus

func (x *Process) GetStatus() Status

func (*Process) GetVersion

func (x *Process) GetVersion() string

func (*Process) ProtoMessage

func (*Process) ProtoMessage()

func (*Process) ProtoReflect added in v0.0.3

func (x *Process) ProtoReflect() protoreflect.Message

func (*Process) Reset

func (x *Process) Reset()

func (*Process) String

func (x *Process) String() string

type ProcessReadAPIClient added in v0.0.2

type ProcessReadAPIClient interface {
	List(ctx context.Context, in *Options, opts ...grpc.CallOption) (ProcessReadAPI_ListClient, error)
	Get(ctx context.Context, in *Options, opts ...grpc.CallOption) (*Process, error)
}

ProcessReadAPIClient is the client API for ProcessReadAPI service.

For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.

func NewProcessReadAPIClient added in v0.0.2

func NewProcessReadAPIClient(cc grpc.ClientConnInterface) ProcessReadAPIClient

type ProcessReadAPIServer added in v0.0.2

type ProcessReadAPIServer interface {
	List(*Options, ProcessReadAPI_ListServer) error
	Get(context.Context, *Options) (*Process, error)
}

ProcessReadAPIServer is the server API for ProcessReadAPI service.

type ProcessReadAPI_ListClient added in v0.0.2

type ProcessReadAPI_ListClient interface {
	Recv() (*Process, error)
	grpc.ClientStream
}

type ProcessReadAPI_ListServer added in v0.0.2

type ProcessReadAPI_ListServer interface {
	Send(*Process) error
	grpc.ServerStream
}

type ProcessWriteAPIClient added in v0.0.2

type ProcessWriteAPIClient interface {
	Create(ctx context.Context, in *Process, opts ...grpc.CallOption) (*Process, error)
	Update(ctx context.Context, in *Process, opts ...grpc.CallOption) (*Process, error)
	Activate(ctx context.Context, in *Options, opts ...grpc.CallOption) (*Process, error)
	Deactivate(ctx context.Context, in *Options, opts ...grpc.CallOption) (*Process, error)
}

ProcessWriteAPIClient is the client API for ProcessWriteAPI service.

For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.

func NewProcessWriteAPIClient added in v0.0.2

func NewProcessWriteAPIClient(cc grpc.ClientConnInterface) ProcessWriteAPIClient

type ProcessWriteAPIServer added in v0.0.2

type ProcessWriteAPIServer interface {
	Create(context.Context, *Process) (*Process, error)
	Update(context.Context, *Process) (*Process, error)
	Activate(context.Context, *Options) (*Process, error)
	Deactivate(context.Context, *Options) (*Process, error)
}

ProcessWriteAPIServer is the server API for ProcessWriteAPI service.

type Process_Data added in v0.0.2

type Process_Data struct {
	Event  *Event  `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"`
	Entity *Entity `protobuf:"bytes,2,opt,name=entity,proto3" json:"entity,omitempty"`
	// contains filtered or unexported fields
}

func (*Process_Data) Descriptor deprecated added in v0.0.2

func (*Process_Data) Descriptor() ([]byte, []int)

Deprecated: Use Process_Data.ProtoReflect.Descriptor instead.

func (*Process_Data) GetEntity added in v0.0.2

func (x *Process_Data) GetEntity() *Entity

func (*Process_Data) GetEvent added in v0.0.2

func (x *Process_Data) GetEvent() *Event

func (*Process_Data) ProtoMessage added in v0.0.2

func (*Process_Data) ProtoMessage()

func (*Process_Data) ProtoReflect added in v0.0.3

func (x *Process_Data) ProtoReflect() protoreflect.Message

func (*Process_Data) Reset added in v0.0.2

func (x *Process_Data) Reset()

func (*Process_Data) String added in v0.0.2

func (x *Process_Data) String() string

type Process_Definition added in v0.0.2

type Process_Definition struct {
	Input  *Process_Data `protobuf:"bytes,1,opt,name=input,proto3" json:"input,omitempty"`
	Output *Process_Data `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"`
	Error  *Process_Data `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"`
	// contains filtered or unexported fields
}

func (*Process_Definition) Descriptor deprecated added in v0.0.2

func (*Process_Definition) Descriptor() ([]byte, []int)

Deprecated: Use Process_Definition.ProtoReflect.Descriptor instead.

func (*Process_Definition) GetError added in v0.0.2

func (x *Process_Definition) GetError() *Process_Data

func (*Process_Definition) GetInput added in v0.0.2

func (x *Process_Definition) GetInput() *Process_Data

func (*Process_Definition) GetOutput added in v0.0.2

func (x *Process_Definition) GetOutput() *Process_Data

func (*Process_Definition) ProtoMessage added in v0.0.2

func (*Process_Definition) ProtoMessage()

func (*Process_Definition) ProtoReflect added in v0.0.3

func (x *Process_Definition) ProtoReflect() protoreflect.Message

func (*Process_Definition) Reset added in v0.0.2

func (x *Process_Definition) Reset()

func (*Process_Definition) String added in v0.0.2

func (x *Process_Definition) String() string

type Status

type Status int32
const (
	Status_UNACTIVATED Status = 0
	Status_ACTIVATED   Status = 1
	Status_DEACTIVATED Status = 2
)

func (Status) Descriptor added in v0.0.3

func (Status) Descriptor() protoreflect.EnumDescriptor

func (Status) Enum added in v0.0.3

func (x Status) Enum() *Status

func (Status) EnumDescriptor deprecated

func (Status) EnumDescriptor() ([]byte, []int)

Deprecated: Use Status.Descriptor instead.

func (Status) Number added in v0.0.3

func (x Status) Number() protoreflect.EnumNumber

func (Status) String

func (x Status) String() string

func (Status) Type added in v0.0.3

func (Status) Type() protoreflect.EnumType

type UnimplementedEntityReadAPIServer added in v0.0.2

type UnimplementedEntityReadAPIServer struct {
}

UnimplementedEntityReadAPIServer can be embedded to have forward compatible implementations.

func (*UnimplementedEntityReadAPIServer) Get added in v0.0.2

func (*UnimplementedEntityReadAPIServer) List added in v0.0.2

type UnimplementedEntityWriteAPIServer added in v0.0.2

type UnimplementedEntityWriteAPIServer struct {
}

UnimplementedEntityWriteAPIServer can be embedded to have forward compatible implementations.

func (*UnimplementedEntityWriteAPIServer) Activate added in v0.0.2

func (*UnimplementedEntityWriteAPIServer) Create added in v0.0.2

func (*UnimplementedEntityWriteAPIServer) Deactivate added in v0.0.2

func (*UnimplementedEntityWriteAPIServer) Update added in v0.0.2

type UnimplementedEventReadAPIServer added in v0.0.2

type UnimplementedEventReadAPIServer struct {
}

UnimplementedEventReadAPIServer can be embedded to have forward compatible implementations.

func (*UnimplementedEventReadAPIServer) Get added in v0.0.2

func (*UnimplementedEventReadAPIServer) List added in v0.0.2

type UnimplementedEventWriteAPIServer added in v0.0.2

type UnimplementedEventWriteAPIServer struct {
}

UnimplementedEventWriteAPIServer can be embedded to have forward compatible implementations.

func (*UnimplementedEventWriteAPIServer) Activate added in v0.0.2

func (*UnimplementedEventWriteAPIServer) Create added in v0.0.2

func (*UnimplementedEventWriteAPIServer) Deactivate added in v0.0.2

func (*UnimplementedEventWriteAPIServer) Update added in v0.0.2

type UnimplementedProcessReadAPIServer added in v0.0.2

type UnimplementedProcessReadAPIServer struct {
}

UnimplementedProcessReadAPIServer can be embedded to have forward compatible implementations.

func (*UnimplementedProcessReadAPIServer) Get added in v0.0.2

func (*UnimplementedProcessReadAPIServer) List added in v0.0.2

type UnimplementedProcessWriteAPIServer added in v0.0.2

type UnimplementedProcessWriteAPIServer struct {
}

UnimplementedProcessWriteAPIServer can be embedded to have forward compatible implementations.

func (*UnimplementedProcessWriteAPIServer) Activate added in v0.0.2

func (*UnimplementedProcessWriteAPIServer) Create added in v0.0.2

func (*UnimplementedProcessWriteAPIServer) Deactivate added in v0.0.2

func (*UnimplementedProcessWriteAPIServer) Update added in v0.0.2

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL