package matchers import ( "fmt" "os" "github.com/onsi/gomega/format" ) type notARegularFileError struct { os.FileInfo } func (t notARegularFileError) Error() string { fileInfo := os.FileInfo(t) switch { case fileInfo.IsDir(): return "file is a directory" default: return fmt.Sprintf("file mode is: %s", fileInfo.Mode().String()) } } type BeARegularFileMatcher struct { expected interface{} err error } func (matcher *BeARegularFileMatcher) Match(actual interface{}) (success bool, err error) { actualFilename, ok := actual.(string) if !ok { return false, fmt.Errorf("BeARegularFileMatcher matcher expects a file path") } fileInfo, err := os.Stat(actualFilename) if err != nil { matcher.err = err return false, nil } if !fileInfo.Mode().IsRegular() { matcher.err = notARegularFileError{fileInfo} return false, nil } return true, nil } func (matcher *BeARegularFileMatcher) FailureMessage(actual interface{}) (message string) { return format.Message(actual, fmt.Sprintf("to be a regular file: %s", matcher.err)) } func (matcher *BeARegularFileMatcher) NegatedFailureMessage(actual interface{}) (message string) { return format.Message(actual, fmt.Sprintf("not be a regular file")) }