123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- package hhc_ast
- import (
- "git.swzry.com/zry/go-hhc-cli/hhc_common"
- "strconv"
- )
- type SDTNodeArgumentValidator func(token string) bool
- type SDTNode_Argument struct {
- FormatDescription string
- Description string
- Parent SyntaxDefTreeNode
- SubCommands *SDT_TrieContainer
- ValArguments []*SDTNode_Argument
- End *SDTNode_End
- Validator SDTNodeArgumentValidator
- }
- func (n *SDTNode_Argument) Validate(token string) bool {
- return n.Validator(token)
- }
- func (n *SDTNode_Argument) IsEnd() bool {
- return false
- }
- func (n *SDTNode_Argument) WalkNext(ctx *SDTWalkContext, token string) (SyntaxDefTreeNode, hhc_common.SDTWalkError) {
- if token == "" {
- if n.End != nil {
- return n.End, nil
- } else {
- return nil, hhc_common.SDTWalkError_IncompleteCommand{}
- }
- }
- if n.SubCommands != nil {
- v, err := n.SubCommands.WalkUtil(token)
- if err != nil {
- return nil, err
- }
- if v != nil {
- ctx.ASTNodes = append(ctx.ASTNodes, ASTNode_Command{
- Name: v.Name,
- })
- return v, nil
- }
- }
- if n.ValArguments != nil {
- for i, v := range n.ValArguments {
- if v != nil {
- if v.Validate(token) {
- ctx.ASTNodes = append(ctx.ASTNodes, ASTNode_ValArg{
- RawToken: token,
- })
- return v, nil
- }
- } else {
- return nil, &hhc_common.SDTWalkError_NullPointerException{RelyToken: token, RelyEntity: "ValArguments[" + strconv.Itoa(i) + "]"}
- }
- }
- }
- return nil, hhc_common.SDTWalkError_UnrecognizedCommand{RelyToken: token}
- }
- func (n *SDTNode_Argument) GetHelps(prefix string) []hhc_common.SDTHelpInfo {
- hi := make([]hhc_common.SDTHelpInfo, 0)
- if n.ValArguments != nil {
- for _, v := range n.ValArguments {
- hi = append(hi, hhc_common.SDTHelpInfo{
- IsArg: true,
- Name: v.FormatDescription,
- Description: v.Description,
- })
- }
- }
- if n.SubCommands != nil {
- kl := n.SubCommands.PrefixGetList(prefix)
- for _, v := range kl {
- hi = append(hi, hhc_common.SDTHelpInfo{
- IsArg: false,
- Name: v.Name,
- Description: v.Description,
- })
- }
- }
- if n.End != nil {
- hi = append(hi, hhc_common.SDTHelpInfo{
- IsArg: true,
- Name: "<cr>",
- Description: "",
- })
- }
- return hi
- }
- func (n *SDTNode_Argument) Fallback(ctx *SDTWalkContext) (SyntaxDefTreeNode, hhc_common.SDTWalkError) {
- if n.Parent != nil {
- if len(ctx.ASTNodes) > 0 {
- ctx.ASTNodes = ctx.ASTNodes[:len(ctx.ASTNodes)-1]
- }
- return n.Parent, nil
- } else {
- return nil, hhc_common.SDTWalkError_LossingParent{RelyName: "#ValArgument"}
- }
- }
- func (n *SDTNode_Argument) AddSubCommand(cmd *SDTNode_Command) *SDTNode_Argument {
- if n.SubCommands == nil {
- n.SubCommands = NewSDT_TrieContainer()
- }
- n.SubCommands.Put(cmd)
- cmd.Parent = n
- return n
- }
- func (n *SDTNode_Argument) AddValArgument(valarg *SDTNode_Argument) *SDTNode_Argument {
- if n.ValArguments == nil {
- n.ValArguments = make([]*SDTNode_Argument, 1)
- n.ValArguments[0] = valarg
- } else {
- n.ValArguments = append(n.ValArguments, valarg)
- }
- valarg.Parent = n
- return n
- }
- func (n *SDTNode_Argument) AddEnd(end *SDTNode_End) *SDTNode_Argument {
- n.End = end
- end.Parent = n
- return n
- }
|