mirror of
https://github.com/wavetermdev/waveterm.git
synced 2024-12-22 16:48:23 +01:00
99 lines
2.5 KiB
Go
99 lines
2.5 KiB
Go
// Copyright 2024, Command Line Inc.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package webcmd
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
|
|
"github.com/wavetermdev/waveterm/pkg/tsgen/tsgenmeta"
|
|
"github.com/wavetermdev/waveterm/pkg/util/utilfn"
|
|
"github.com/wavetermdev/waveterm/pkg/waveobj"
|
|
"github.com/wavetermdev/waveterm/pkg/wshutil"
|
|
)
|
|
|
|
const (
|
|
WSCommand_SetBlockTermSize = "setblocktermsize"
|
|
WSCommand_BlockInput = "blockinput"
|
|
WSCommand_Rpc = "rpc"
|
|
)
|
|
|
|
type WSCommandType interface {
|
|
GetWSCommand() string
|
|
}
|
|
|
|
func WSCommandTypeUnionMeta() tsgenmeta.TypeUnionMeta {
|
|
return tsgenmeta.TypeUnionMeta{
|
|
BaseType: reflect.TypeOf((*WSCommandType)(nil)).Elem(),
|
|
TypeFieldName: "wscommand",
|
|
Types: []reflect.Type{
|
|
reflect.TypeOf(SetBlockTermSizeWSCommand{}),
|
|
reflect.TypeOf(BlockInputWSCommand{}),
|
|
reflect.TypeOf(WSRpcCommand{}),
|
|
},
|
|
}
|
|
}
|
|
|
|
type WSRpcCommand struct {
|
|
WSCommand string `json:"wscommand" tstype:"\"rpc\""`
|
|
Message *wshutil.RpcMessage `json:"message"`
|
|
}
|
|
|
|
func (cmd *WSRpcCommand) GetWSCommand() string {
|
|
return cmd.WSCommand
|
|
}
|
|
|
|
type SetBlockTermSizeWSCommand struct {
|
|
WSCommand string `json:"wscommand" tstype:"\"setblocktermsize\""`
|
|
BlockId string `json:"blockid"`
|
|
TermSize waveobj.TermSize `json:"termsize"`
|
|
}
|
|
|
|
func (cmd *SetBlockTermSizeWSCommand) GetWSCommand() string {
|
|
return cmd.WSCommand
|
|
}
|
|
|
|
type BlockInputWSCommand struct {
|
|
WSCommand string `json:"wscommand" tstype:"\"blockinput\""`
|
|
BlockId string `json:"blockid"`
|
|
InputData64 string `json:"inputdata64"`
|
|
}
|
|
|
|
func (cmd *BlockInputWSCommand) GetWSCommand() string {
|
|
return cmd.WSCommand
|
|
}
|
|
|
|
func ParseWSCommandMap(cmdMap map[string]any) (WSCommandType, error) {
|
|
cmdType, ok := cmdMap["wscommand"].(string)
|
|
if !ok {
|
|
return nil, fmt.Errorf("no wscommand field in command map")
|
|
}
|
|
switch cmdType {
|
|
case WSCommand_SetBlockTermSize:
|
|
var cmd SetBlockTermSizeWSCommand
|
|
err := utilfn.DoMapStructure(&cmd, cmdMap)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error decoding SetBlockTermSizeWSCommand: %w", err)
|
|
}
|
|
return &cmd, nil
|
|
case WSCommand_BlockInput:
|
|
var cmd BlockInputWSCommand
|
|
err := utilfn.DoMapStructure(&cmd, cmdMap)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error decoding BlockInputWSCommand: %w", err)
|
|
}
|
|
return &cmd, nil
|
|
case WSCommand_Rpc:
|
|
var cmd WSRpcCommand
|
|
err := utilfn.DoMapStructure(&cmd, cmdMap)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error decoding WSRpcCommand: %w", err)
|
|
}
|
|
return &cmd, nil
|
|
default:
|
|
return nil, fmt.Errorf("unknown wscommand type %q", cmdType)
|
|
}
|
|
|
|
}
|