Script.go
package core
import (
"bufio"
"fmt"
"os"
"strings"
)
// Script 구조체는 스크립트 실행을 위한 기본적인 기능을 제공합니다.
type Script struct {
Description string // 스크립트 설명
Options map[string]Option // 스크립트 옵션들
Args map[string]string // 스크립트 인자들
}
// Option 구조체는 스크립트 옵션을 표현합니다.
type Option struct {
Short string // 단축 옵션
Example string // 예제
Description string // 설명
}
// NewScript 함수는 새로운 Script 구조체를 생성합니다.
func NewScript() *Script {
return &Script{
Options: make(map[string]Option),
Args: make(map[string]string),
}
}
// SetArgs 함수는 Script 구조체의 인자들을 설정합니다.
func (s *Script) SetArgs(args map[string]string) {
s.Args = args
}
// GetArgs 함수는 Script 구조체의 인자들을 반환합니다.
func (s *Script) GetArgs() map[string]string {
return s.Args
}
// Print 함수는 주어진 객체를 표준 출력에 출력합니다.
func (s *Script) Print(obj interface{}) {
fmt.Println(obj)
}
// Ask 함수는 사용자에게 메시지를 출력하고 사용자의 입력을 받습니다.
func (s *Script) Ask(msg string) string {
if msg != "" {
fmt.Println(msg)
}
reader := bufio.NewReader(os.Stdin)
response, _ := reader.ReadString('\n')
return strings.TrimSpace(response)
}
// Main 함수는 Script를 구현한 구조체에서 재정의되어야 합니다.
func (s *Script) Main() {
// 하위 클래스에서 재정의될 메서드입니다.
}
// AddOption 함수는 Script 구조체에 새로운 옵션을 추가합니다.
func (s *Script) AddOption(key, short, example, description string) {
s.Options[key] = Option{Short: short, Example: example, Description: description}
}
// Help 함수는 Script의 도움말을 출력합니다.
func (s *Script) Help() {
base := os.Args[0]
script := strings.TrimPrefix(base, "./")
maxLength := 0
// 기본적으로 help 옵션을 추가합니다.
if _, exists := s.Options["help"]; !exists {
s.AddOption("help", "h", "", "This help")
}
// 가장 긴 옵션의 길이를 계산합니다.
for key, value := range s.Options {
shortString := ""
if value.Short != "" {
shortString = "-" + value.Short
}
example := value.Example
length := len(fmt.Sprintf(" %s --%s %s ", shortString, key, example))
if length > maxLength {
maxLength = length
}
}
// 사용법을 출력합니다.
fmt.Printf("\nUsage: %s %s -- [args...]\n", base, script)
// 가장 처음 옵션에 대한 사용법을 출력합니다.
for key, value := range s.Options {
example := value.Example
fmt.Printf(" %s %s --%s %s\n", base, script, key, example)
break
}
// 옵션 목록을 출력합니다.
fmt.Println("\nOptions: ")
for key, value := range s.Options {
shortString := ""
if value.Short != "" {
shortString = "-" + value.Short
}
example := value.Example
description := value.Description
prefix := fmt.Sprintf(" %s --%s %s ", shortString, key, example)
fmt.Printf("%-*s %s\n", maxLength, prefix, description)
}
// 스크립트 설명을 출력합니다.
fmt.Println()
fmt.Println(s.Description)
}
Script 구조체
Option 구조체
NewScript 함수
SetArgs 메서드
GetArgs 메서드
Print 메서드
Ask 메서드
Main 메서드
AddOption 메서드
Help 메서드
코드 요약
Last updated