suite retire и проверка словаря в документе для читателя
- suite retire снимает правило, конвенцию или тему: правило остаётся заглушкой с датой и причиной, имя уезжает в раздел выбывших, снятие с непогашенными ссылками отклоняется с перечнем мест - добавлена проверка META-30: короткое описание языка обязано называть все слова словаря, иначе читатель копии толкует их по памяти - retired-раздел манифеста больше не считается объявлением пути: снятый префикс означает, что файл ушёл вместе с ним
This commit is contained in:
+28
-1
@@ -5,6 +5,7 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"slices"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@@ -29,6 +30,8 @@ type Field struct {
|
||||
Default string
|
||||
// Optional fields may stay empty.
|
||||
Optional bool
|
||||
// Options, when given, are the only answers accepted.
|
||||
Options []string
|
||||
// Check validates an answer; it is applied in both modes.
|
||||
Check func(string) error
|
||||
}
|
||||
@@ -54,6 +57,11 @@ func (d *dialogue) ask(f Field) (string, error) {
|
||||
}
|
||||
prompt := f.Ask
|
||||
switch {
|
||||
case len(f.Options) > 0:
|
||||
prompt += fmt.Sprintf(" (%s)", strings.Join(f.Options, " / "))
|
||||
if f.Default != "" {
|
||||
prompt += fmt.Sprintf(" [%s]", f.Default)
|
||||
}
|
||||
case f.Default != "":
|
||||
prompt += fmt.Sprintf(" [%s]", f.Default)
|
||||
case f.Optional:
|
||||
@@ -81,9 +89,28 @@ func (d *dialogue) ask(f Field) (string, error) {
|
||||
}
|
||||
}
|
||||
|
||||
// confirm asks a yes-or-no question before something irreversible, defaulting
|
||||
// to no: a retirement that went through because the reader pressed enter is the
|
||||
// one mistake the model cannot undo.
|
||||
func (d *dialogue) confirm(question string) (bool, error) {
|
||||
fmt.Fprintf(d.out, "\n%s [y/N]: ", question)
|
||||
line, err := d.in.ReadString('\n')
|
||||
answer := strings.ToLower(strings.TrimSpace(line))
|
||||
if answer == "" && err != nil {
|
||||
return false, errStop
|
||||
}
|
||||
return answer == "y" || answer == "yes", nil
|
||||
}
|
||||
|
||||
// validate applies a field's check to a value that is not empty.
|
||||
func validate(f Field, value string) error {
|
||||
if value == "" || f.Check == nil {
|
||||
if value == "" {
|
||||
return nil
|
||||
}
|
||||
if len(f.Options) > 0 && !slices.Contains(f.Options, value) {
|
||||
return fmt.Errorf("one of: %s", strings.Join(f.Options, ", "))
|
||||
}
|
||||
if f.Check == nil {
|
||||
return nil
|
||||
}
|
||||
return f.Check(value)
|
||||
|
||||
Reference in New Issue
Block a user