Skip to content

Latest commit

 

History

History
97 lines (84 loc) · 4.04 KB

File metadata and controls

97 lines (84 loc) · 4.04 KB

Contribution

Для того, чтобы добавить обработку новых команд в CLI, вам необходимо:

func name_cmd(cmd parseline.Command, b *bytes.Buffer) (*bytes.Buffer, error) {}
  • Напиши тесты для новой функции в фаил commands_test.go
//Напишите название новой функции
func TestNameCommand(t *testing.T) {
	tests := []struct {
		name    string // название теста
		cmd     parseline.Command // команда, которую хотите выполнить
		input   *bytes.Buffer // буффер от прошлой функции в pipeline
		want    string // ожидаемый результат
		wantErr bool // должена ли функция возвращать ошибку
	}{
        // Задайте параметры тестов
	}
    for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
            // Вместо NAME_CMD напишите название новой функции
			got, err := NAME_CMD(tt.cmd, tt.input)
			if (err != nil) != tt.wantErr {
				t.Errorf("wc() error = %v, wantErr %v", err, tt.wantErr)
				return
			}
			if got != nil && got.String() != tt.want {
				t.Errorf("wc() = %v, want %v", got.String(), tt.want)
			}
		})
	}
}
  • После прохождения тестов, добавьте новый функционал в систему. Для этого вернемся в фаил commands.go и в методе New() добавьте инициализацию вашей команды.
func newCommands() commands {
	cmds := make(commands)

	// Here you can add new command in CLI
	// cmd["name_command"] = name_command
	// below you need to implement a command with the following signature:
	// func(parseline.Command, *bytes.Buffer) (*bytes.Buffer, error)
	cmds["cat"] = cat
	cmds["echo"] = echo
	cmds["exit"] = exit
	cmds["pwd"] = pwd
	cmds["wc"] = wc
	cmds["grep"] = grep


	return cmds
}
  • Дополните документацию по новой команде в Commands.md

Требования/советы к реализации:

  • На вход подается структура parseline.Command, которая задана в файле parser.go
// Command store name of command and it's flags and args
type Command struct {
	Name string  
	Args []string 
}
  • Парсер разделяет получаемую команду на command и args, в буффере будет записана только возвращаемое значение предыдущей команды в pipeline. Буффер всегда будет инициализован.

  • В случае если функция завершилась без ошибки, но ничего не возвращает, возвращать не nil буффер!!!

return bytes.NewBufferString(""), nil // так


return nil, nil // не так
  • В случае если во время испольнения произошла какая-то ошибка, вы вольны создавать ее как через пакет errors, так и через пакет fmt
return nil, errors.New("no input provided") // так, в случае создания ошибки

return nil, fmt.Errorf("cat: %w", err) // так, в случае обертки надо полученной ошибкой
  • Parser соберет command без удаление скобок и ковычек, примеры:
>>> echo "111"

На испольнение будет передана команда:

Command {
    name: "echo",
    args: [`"111"`],
}