package hhc_ast import ( "git.swzry.com/zry/go-hhc-cli/hhc_common" "strconv" ) type SDTNode_Command struct { Name string Description string Parent SyntaxDefTreeNode //SubCommands map[string]*SDTNode_Command SubCommands *SDT_TrieContainer ValArguments []*SDTNode_Argument End *SDTNode_End } func (n *SDTNode_Command) IsEnd() bool { return false } func (n *SDTNode_Command) 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_Command) 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: "", Description: "", }) } return hi } func (n *SDTNode_Command) 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: n.Name} } } func (n *SDTNode_Command) AddSubCommand(cmd *SDTNode_Command) *SDTNode_Command { if n.SubCommands == nil { n.SubCommands = NewSDT_TrieContainer() } n.SubCommands.Put(cmd) cmd.Parent = n return n } func (n *SDTNode_Command) AddValArgument(valarg *SDTNode_Argument) *SDTNode_Command { 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_Command) AddEnd(end *SDTNode_End) *SDTNode_Command { n.End = end end.Parent = n return n }