diff --git a/dclish/dclish.go b/dclish/dclish.go index 74f03a1aa93a76439b0d29e3aa91cf42ff6443f3..07d4a13fdedd792716d00f062424772451aeef83 100644 --- a/dclish/dclish.go +++ b/dclish/dclish.go @@ -14,6 +14,7 @@ type Flag struct { Value string Default string Description string + // TODO: Toggle bool } // Flags is the list of flags. @@ -21,8 +22,11 @@ type Flags map[string]*Flag // Command contains the definition of a command, it's flags and subcommands. type Command struct { - Flags Flags - Args []string + Flags Flags + // TODO: FlagOrder []string + Args []string + // TODO: MaxArgs int + // TODO: MinArgs int Commands []*Command Action ActionFunc Description string @@ -52,18 +56,19 @@ func (c Commands) ParseAndRun(line string) error { return cmd.Action(cmd) } // TODO: need to clean this up. - for i := range words[1:] { - if strings.HasPrefix(words[i], "/") { - flag, val, assigned := strings.Cut(words[i], "=") + args := words[1:] + for i := range args { + if strings.HasPrefix(args[i], "/") { + flag, val, assigned := strings.Cut(args[i], "=") if assigned { wordup := strings.ToUpper(flag) flg, ok := cmd.Flags[wordup] if !ok { - fmt.Printf("ERROR: Flag '%s' not recognised.", words[i]) + fmt.Printf("ERROR: Flag '%s' not recognised.", args[i]) } flg.Value = val } else { - wordup := strings.ToUpper(words[i]) + wordup := strings.ToUpper(args[i]) value := "true" if strings.HasPrefix(wordup, "/NO") { wordup = strings.Replace(wordup, "/NO", "/", 1) @@ -71,12 +76,12 @@ func (c Commands) ParseAndRun(line string) error { } flg, ok := cmd.Flags[wordup] if !ok { - fmt.Printf("ERROR: Flag '%s' not recognised.", words[i]) + fmt.Printf("ERROR: Flag '%s' not recognised.", args[i]) } flg.Value = value } } else { - cmd.Args = append(cmd.Args, words[i]) + cmd.Args = append(cmd.Args, args[i]) } } return cmd.Action(cmd) diff --git a/repl/command.go b/repl/command.go index 3bd1bd14110300319b91bbd772db68b0352150a0..72161f8ff31ba51e915667b00ab372bc542f9a1f 100644 --- a/repl/command.go +++ b/repl/command.go @@ -552,17 +552,6 @@ folder at the other node is also a SYSTEM folder. }, }, }, - "Ctrl-C": { - Description: `Except for when BULLETIN is awaiting input from the terminal, a -CTRL-C will cause BULLETIN to abort the execution of any command. If -BULLETIN is waiting for terminal input, a CTRL-C will cause BULLETIN -to return to the BULLETIN> prompt. If for some reason the user wishes -to suspend BULLETIN, CTRL-Y will usually do so. However, this is not -always true, as BULLETIN will ignore the CTRL-Y if it has a data file -opened at the time. (Otherwise it would be possible to put the files -in a state such that they would be inaccessible by other users.) -`, - }, "CURRENT": { Description: `Displays the beginning of the message you are currently reading. If you are reading a long message and want to display the first part @@ -835,52 +824,6 @@ file exists, the file would be appended to that file. }, "FORWARD": { Description: `Synonym for MAIL command. -`, - }, - "Folders": { - Description: `All messages are divided into separate folders. The default folder is -GENERAL. New folders can be created by any user. As an example, the -following creates a folder for GAMES related messages: - -BULLETIN> CREATE GAMES -Enter a one line description of folder. -GAMES - -To see the list of available folders, use DIRECTORY/FOLDERS. To select -a specific folder, use the SELECT command. - -If a user selects a folder and enters the SET READNEW command, that -user will be alerted of topics of new messages at login time, and will -then be given the option of reading them. Similar to READNEW is SHOWNEW, -which displays the topics but doesn't prompt to read them. Even less is -SET BRIEF, which will cause only a one line output indicating that there -are new messages in the folder. There also is the SET NOTIFY option, -which will cause a message to be broadcast to a user's terminal alerting -the user that a new message has been added. Any of these options can be -the default for the folder by using the /DEFAULT switch on the command. - -A folder can be restricted to only certain users, if desired. This is -done by specifying CREATE/PRIVATE. Afterwards, access to the folder is -controlled by the creator by the SET [NO]ACCESS command. If /SEMIPRIVATE -rather than /PRIVATE is specified, all users can read the messages in the -folder, but only those give access can add messages. - -A folder can be converted into a remote folder using CREATE/NODE or SET -NODE. A remote folder is one which points to a folder on a remote DECNET -node. Messages added to a remote node are actually stored on the folder -on the remote node. The BULLCP process (created by BULLETIN/STARTUP) -must be running on the remote node for this option to be used. - -A folder can be specified as a SYSTEM folder, i.e. one in which SYSTEM/ -SHUTDOWN/BROADCAST messages can be added. By default, the GENERAL folder -is a SYSTEM folder (and cannot be changed). One use for this is to create -a remote SYSTEM folder which is shared by all nodes, so that the GENERAL -folder is used for messages pertaining only to the local host, while the -remote folder is used for messages pertaining to all nodes. Another -use is to create a folder for posting SYSTEM messages only meant for a -certain UIC group. This is done by creating a PRIVATE SYSTEM folder, and -giving access to that UIC group. Only users in that UIC group will see -the messages in that folder when they log in. `, }, "HELP": { diff --git a/repl/help.go b/repl/help.go index 2e57c4bd4598aacc85ff1702df002b5620fbef60..b2beca93c3ddce51fad74e30320232cd0e6e9d18 100644 --- a/repl/help.go +++ b/repl/help.go @@ -8,7 +8,66 @@ import ( "git.lyda.ie/kevin/bulletin/dclish" ) -var helpmap map[string]string +var helpmap = map[string]string{ + "FOLDERS": `All messages are divided into separate folders. The default folder is +GENERAL. New folders can be created by any user. As an example, the +following creates a folder for GAMES related messages: + +BULLETIN> CREATE GAMES +Enter a one line description of folder. +GAMES + +To see the list of available folders, use DIRECTORY/FOLDERS. To select +a specific folder, use the SELECT command. + +If a user selects a folder and enters the SET READNEW command, that +user will be alerted of topics of new messages at login time, and will +then be given the option of reading them. Similar to READNEW is SHOWNEW, +which displays the topics but doesn't prompt to read them. Even less is +SET BRIEF, which will cause only a one line output indicating that there +are new messages in the folder. There also is the SET NOTIFY option, +which will cause a message to be broadcast to a user's terminal alerting +the user that a new message has been added. Any of these options can be +the default for the folder by using the /DEFAULT switch on the command. + +A folder can be restricted to only certain users, if desired. This is +done by specifying CREATE/PRIVATE. Afterwards, access to the folder is +controlled by the creator by the SET [NO]ACCESS command. If /SEMIPRIVATE +rather than /PRIVATE is specified, all users can read the messages in the +folder, but only those give access can add messages. + +A folder can be converted into a remote folder using CREATE/NODE or SET +NODE. A remote folder is one which points to a folder on a remote DECNET +node. Messages added to a remote node are actually stored on the folder +on the remote node. The BULLCP process (created by BULLETIN/STARTUP) +must be running on the remote node for this option to be used. + +A folder can be specified as a SYSTEM folder, i.e. one in which SYSTEM/ +SHUTDOWN/BROADCAST messages can be added. By default, the GENERAL folder +is a SYSTEM folder (and cannot be changed). One use for this is to create +a remote SYSTEM folder which is shared by all nodes, so that the GENERAL +folder is used for messages pertaining only to the local host, while the +remote folder is used for messages pertaining to all nodes. Another +use is to create a folder for posting SYSTEM messages only meant for a +certain UIC group. This is done by creating a PRIVATE SYSTEM folder, and +giving access to that UIC group. Only users in that UIC group will see +the messages in that folder when they log in.`, + "Ctrl-C": `Except for when BULLETIN is awaiting input from the terminal, a +CTRL-C will cause BULLETIN to abort the execution of any command. If +BULLETIN is waiting for terminal input, a CTRL-C will cause BULLETIN +to return to the BULLETIN> prompt. If for some reason the user wishes +to suspend BULLETIN, CTRL-Y will usually do so. However, this is not +always true, as BULLETIN will ignore the CTRL-Y if it has a data file +opened at the time. (Otherwise it would be possible to put the files +in a state such that they would be inaccessible by other users.) +`, +} + +func init() { + for c := range commands { + helpmap[c] = commands[c].Description + } +} // ActionHelp handles the `HELP` command. func ActionHelp(cmd *dclish.Command) error { @@ -19,7 +78,6 @@ func ActionHelp(cmd *dclish.Command) error { wordup := strings.ToUpper(cmd.Args[0]) helptext, ok := helpmap[wordup] if !ok { - // TODO: add a help structure for topics that are not command. fmt.Printf("ERROR: Topic not found: '%s'.\n", cmd.Args[0]) return nil }