Documentation
¶
Index ¶
- Variables
- func IsAsync(state ClientMessageType) bool
- type ClientContent
- type ClientMessage
- type ClientMessageType
- type IsaClient
- func (c *IsaClient) Cleanup(ctx context.Context, logger log.Logger, session uuid.UUID) error
- func (c *IsaClient) Close() error
- func (c *IsaClient) ConnectPooledClient(ctx context.Context, logger log.Logger, server netip.AddrPort) (*IsaClient, error)
- func (c *IsaClient) CreateSession(ctx context.Context, logger log.Logger, args *SessionStartArgs) (uuid.UUID, error)
- func (c *IsaClient) Echo(ctx context.Context, logger log.Logger, content string) (*ServerMessage, error)
- func (c *IsaClient) Handshake(ctx context.Context, logger log.Logger, password []byte, validateResponse bool) (*ServerMessage, error)
- func (c *IsaClient) HasLS(ctx context.Context, logger log.Logger) (bool, error)
- func (c *IsaClient) ListSessions(ctx context.Context, logger log.Logger) ([]uuid.UUID, error)
- func (c *IsaClient) PurgeTheories(ctx context.Context, logger log.Logger, args *PurgeTheoriesArgs) ([]string, error)
- func (c *IsaClient) ReadLine(ctx context.Context, logger log.Logger) ([]byte, error)
- func (c *IsaClient) ReadMessage(ctx context.Context, logger log.Logger) (*ServerMessage, error)
- func (c *IsaClient) Reconnect(ctx context.Context, logger log.Logger, password []byte, validateResponse bool) error
- func (c *IsaClient) SetDeadline(t time.Time) error
- func (c *IsaClient) SetReadDeadline(t time.Time) error
- func (c *IsaClient) StopSession(ctx context.Context, logger log.Logger, session uuid.UUID) error
- func (c *IsaClient) TestMode()
- func (c *IsaClient) WaitState(ctx context.Context, logger log.Logger, skip []ServerMessageState, ...) (*ServerMessage, error)
- func (c *IsaClient) WaitTask(ctx context.Context, logger log.Logger, taskID string, ...) (*ServerMessage, error)
- func (c *IsaClient) Write(ctx context.Context, logger log.Logger, msg []byte) (int, error)
- func (c *IsaClient) WriteMessage(ctx context.Context, logger log.Logger, msg *ClientMessage) (int, error)
- type IsaClientState
- type PurgeTheoriesArgs
- type ServerMessage
- type ServerMessageState
- type SessionStartArgs
- type UseTheoriesArguments
Constants ¶
This section is empty.
Variables ¶
var ( ErrConnectionNotReady = errors.New("connection is not ready for request") ErrUnexpectedState = errors.New("received a non-ok message") ErrSessionCreation = errors.New("failed to create new session") ErrUseTheories = errors.New("failed to call use_theories") ErrSessionStop = errors.New("failed to stop session") ErrPurgeTheories = errors.New("failed to purge theories") ErrListSessions = errors.New("failed to list sessions") )
helper data for IsaClient
var ( ErrPasswordHandshake = errors.New("password handshake failed") ErrDeadlinePassed = errors.New("deadline has passed before write") )
var ( ErrTaskFailed = errors.New("async task resulted in an Error") ErrTaskFailedInner = errors.New("async task finished with a non-ok FINISHED") )
var DefaultSessionOptions = []string{
"headless_consolidate_delay=0.5",
"headless_prune_delay=5",
"show_states",
}
var ErrListSessionsUnsupported = errors.New("server appears to not support the list_sessions command")
error for ListSessions call when list_sessions command is not supported
helper values for parseMessage
Functions ¶
func IsAsync ¶
func IsAsync(state ClientMessageType) bool
is a client message async? refer to the system documentation for more information
Types ¶
type ClientMessage ¶
type ClientMessage struct {
State ClientMessageType // type of message, i.e., used command
Content ClientContent
}
a decoded Isabelle client message (JSON format only)
func MustParseClientMessage ¶
func MustParseClientMessage(message []byte) *ClientMessage
parse a message from a string, panic on failure, only use on known-good messages NOTE: intended as a helper for unit tests and similar applications
func NewEchoMessage ¶
func NewEchoMessage(content string) *ClientMessage
create new message for ECHO commands
func NewMessage ¶
func NewMessage(state ClientMessageType, content map[string]any) *ClientMessage
create new empty message, mostly used for testing
func ParseClientMessage ¶
func ParseClientMessage(message []byte, msg *ClientMessage) (*ClientMessage, error)
parse a message from a string
func (*ClientMessage) Encode ¶
func (msg *ClientMessage) Encode() ([]byte, error)
encode a message TODO: optimize this to reduce allocs
func (*ClientMessage) Get ¶
func (msg *ClientMessage) Get(key string) (string, error)
gracefully try to extract a string value from content
func (*ClientMessage) IsAsync ¶
func (msg *ClientMessage) IsAsync() bool
is a client message async? refer to the system documentation for more information
func (*ClientMessage) String ¶
func (msg *ClientMessage) String() string
type ClientMessageType ¶
type ClientMessageType byte
state of an isabelle server message
const ( // zero value = invalid command ClientUnknown ClientMessageType = iota // echo ClientEcho // commands that don't have arguments ClientHelp ClientListSessions ClientShutdown // commands that require JSON arguments ClientPurgeTheories ClientSessionBuild ClientSessionStart ClientSessionStop ClientUseTheories ClientCancel )
func (ClientMessageType) String ¶
func (cmt ClientMessageType) String() string
stringify ClientMessageState for debugging
type IsaClient ¶
type IsaClient struct {
State IsaClientState // current client state, state machine for connection
// contains filtered or unexported fields
}
Client for interacting with an Isabelle Server (not safe for concurrent use) Based on net.Conn with an internal buffer
Includes low level abstractions for reading individual lines and messages as well as direct wrappers for the client commands.
func ConnectClient ¶
func ConnectClient( ctx context.Context, logger log.Logger, server netip.AddrPort, ) (*IsaClient, error)
connect a new client to a server instance, NOTE: doesn't perform handshake
func (*IsaClient) Cleanup ¶
purge theories and close session, basically just c.PurgeTheories + c.StopSession
func (*IsaClient) ConnectPooledClient ¶
func (c *IsaClient) ConnectPooledClient( ctx context.Context, logger log.Logger, server netip.AddrPort, ) (*IsaClient, error)
connect a client to a server instance, may work on nil NOTE: doesn't perform handshake
func (*IsaClient) CreateSession ¶
func (c *IsaClient) CreateSession( ctx context.Context, logger log.Logger, args *SessionStartArgs, ) (uuid.UUID, error)
create a new session, returns the used ID
func (*IsaClient) Echo ¶
func (c *IsaClient) Echo( ctx context.Context, logger log.Logger, content string, ) (*ServerMessage, error)
echo command, NOTE: this doesn't require JSON contents for the request/ response. NOTE: requires '"' characters to escaped already with '\"', otherwise the server will reject the echo message
func (*IsaClient) Handshake ¶
func (c *IsaClient) Handshake( ctx context.Context, logger log.Logger, password []byte, validateResponse bool, ) (*ServerMessage, error)
attempt handshake with server, can optionally check if server responded with OK NOTE: the server will normally close the conn, if the password is invalid, so manual checking of the response is not really necessary NOTE: may return the handshake OK, if err == nil, this can be used to simulate the real client
func (*IsaClient) HasLS ¶
check if list_sessions extensions is supported
func (*IsaClient) ListSessions ¶
list sessions on Isabelle server (done via custom extensions, not always available)
func (*IsaClient) PurgeTheories ¶
func (c *IsaClient) PurgeTheories( ctx context.Context, logger log.Logger, args *PurgeTheoriesArgs, ) ([]string, error)
issue purge theories command
func (*IsaClient) ReadLine ¶
read a line from the conn buffer and/or the conn NOTE: the output is only valid until the next call to ReadLine or another method that writes/ reads returns: (line, error)
func (*IsaClient) ReadMessage ¶
func (*IsaClient) Reconnect ¶
func (c *IsaClient) Reconnect( ctx context.Context, logger log.Logger, password []byte, validateResponse bool, ) error
reconnect underlying client
func (*IsaClient) SetDeadline ¶
SetDeadline for the underlying TCP connection
func (*IsaClient) SetReadDeadline ¶
SetReadDeadline for the underlying TCP connection NOTE: assumes client != nil && client.conn != nil
func (*IsaClient) StopSession ¶
issue stop_session command
func (*IsaClient) TestMode ¶
func (c *IsaClient) TestMode()
dedicated function to enable logging for testing
func (*IsaClient) WaitState ¶
func (c *IsaClient) WaitState( ctx context.Context, logger log.Logger, skip []ServerMessageState, target ServerMessageState, ) (*ServerMessage, error)
await server messages while skipping all messages with state \in skip
func (*IsaClient) WaitTask ¶
func (c *IsaClient) WaitTask( ctx context.Context, logger log.Logger, taskID string, unrelatedMsgChan chan<- *ServerMessage, ) (*ServerMessage, error)
await an async task. This function will redirect all other messages to unrelatedMsgChan if defined
func (*IsaClient) Write ¶
raw write to underlying connection
type IsaClientState ¶
type IsaClientState byte
state of an IsaClient, starts with disconnected
const ( // client is disconnected -> unusable with no attached TCP connection IcsDisconnected IsaClientState = iota // client is connected and usable for r/w IcsIdle // client is in unknown and unrecoverable state IcsCorrupt // client is performing handshake and not yet ready for use IcsConnecting )
func (IsaClientState) String ¶
func (state IsaClientState) String() string
type PurgeTheoriesArgs ¶
type PurgeTheoriesArgs struct {
SessionID uuid.UUID // session to purge theories in
Theories []string // theories to purge explicitly
MasterDir string // master_dir, as in use_theories, for relative theory names
All bool // purge all theories
}
func (*PurgeTheoriesArgs) Map ¶
func (args *PurgeTheoriesArgs) Map() map[string]any
convert to generic map
type ServerMessage ¶
type ServerMessage struct {
State ServerMessageState // message type
Content any // content of message as parsed JSON
}
a decoded isabelle server message (JSON format only, except when State = Echo)
func MustParseServerMessage ¶
func MustParseServerMessage(message []byte) *ServerMessage
parse a message from a string, panic on failure, only use on known-good messages NOTE: intended as a helper for unit tests and similar applications
func ParseServerMessage ¶
func ParseServerMessage(message []byte) (*ServerMessage, error)
parse a message from a string
func (*ServerMessage) Get ¶
func (msg *ServerMessage) Get(key string) (string, error)
gracefully try to extract a string value from content
func (*ServerMessage) Json ¶
func (msg *ServerMessage) Json() ([]byte, error)
encode a message into JSON
func (*ServerMessage) Keys ¶
func (msg *ServerMessage) Keys() []string
returns keys of content, if content ~ map[string]any, otherwise empty array intended for debugging
func (*ServerMessage) Ok ¶
func (msg *ServerMessage) Ok() (bool, error)
try to extract ok field from content
func (*ServerMessage) String ¶
func (msg *ServerMessage) String() string
func (*ServerMessage) TaskID ¶
func (msg *ServerMessage) TaskID() (string, error)
try to extract task id from content
type ServerMessageState ¶
type ServerMessageState byte
state of an isabelle server message
const ( ServerUnknown ServerMessageState = iota ServerFinished ServerError ServerPreconditionError // server error for out of spec messages ServerFailed ServerInfo ServerNote ServerOk ServerEcho )
func ParseServerState ¶
func ParseServerState(state []byte) ServerMessageState
parse a stringified state as server message state
func (ServerMessageState) String ¶
func (sms ServerMessageState) String() string
stringify MessageState for debugging
type SessionStartArgs ¶
type SessionStartArgs struct {
Session string `json:"session,omitempty"` // target session name
Preferences string `json:"preferences,omitempty"` // env of isabelle systems
Options []string `json:"options"` // options, like -o for isabelle build, as `key=value` strings, if nil, then DefaultSessionOptions will be used instead
Directories []string `json:"dirs,omitempty"` // additional dirs for ROOT and ROOTS
IncludeSession []string `json:"include_sessions,omitempty"` // sessions to include in ns for session-qualified theory names
Verbose bool `json:"verbose,omitempty"` // whether to give more NOTEs
PrintMode string `json:"print_mode,omitempty"` // whether to print more debug information
MasterDir string `json:"master_dir,omitempty"` // set master_dir
}
Arguments for building a new isabelle session, as defined in the isabelle system documentation Equivalent to the `session_build_args` type.
func (*SessionStartArgs) Map ¶
func (args *SessionStartArgs) Map() map[string]any
type UseTheoriesArguments ¶
type UseTheoriesArguments struct {
SessionID uuid.UUID // session_id, required
Theories []string // theories, required
MasterDir string // master_dir, optional, default session tmp_dir
PrettyMargin float64 // pretty_margin, optional, default 76
UnicodeSymbols bool // unicode_symbols, optional
ExportPattern string // export_pattern, optional
CheckDelay float64 // check_delay, optional, default: 0.5
CheckLimit int // check_limit, optional
WatchdogTimeout float64 // watchdog_timeout, default: 600
NodesStatusDelay float64 // nodes_status_delay, default: -1
}
translation of use_theories_arguments
func (*UseTheoriesArguments) Map ¶
func (args *UseTheoriesArguments) Map() map[string]any
Source Files
¶
- args.go
- client-commands.go
- client-messages.go
- client.go
- server-messages.go
Directories
¶
| Path | Synopsis |
|---|---|
|
cmd
|
|
|
isa-client
command
|
|
|
Test utils for isalink, intended for internal use, no stable API guarantees This was extracted from the main isalink tests ot use in `sync`.
|
Test utils for isalink, intended for internal use, no stable API guarantees This was extracted from the main isalink tests ot use in `sync`. |
|
sync package implements an abstraction over `isalink.IsaClient` that is safe for concurrent use it is intended for use with multiple readers that await asynchronous commands
|
sync package implements an abstraction over `isalink.IsaClient` that is safe for concurrent use it is intended for use with multiple readers that await asynchronous commands |