package cli import ( "io" "os" ) // A Source is a method of extracting input from the user. type Source interface { // Extract fetches data from this source. Extract() (string, error) } // A StringSource is defined by a string. type StringSource struct{ Data string } // Extract pulls input data from the internal string. func (s StringSource) Extract() (string, error) { return s.Data, nil } // A StdinSource pulls from standard input. type StdinSource struct{} // Extract pulls input data from standard input. func (s StdinSource) Extract() (string, error) { data, err := io.ReadAll(os.Stdin) if err != nil { return "", err } return string(data), nil } // A FileSource reads from a file. type FileSource struct{ Path string } // Extract pulls input data from the file source. func (s FileSource) Extract() (string, error) { data, err := os.ReadFile(s.Path) if err != nil { return "", err } return string(data), nil }