package metadata import ( "regexp" "strings" ) type ChangeSetExtractor struct { re *regexp.Regexp cleaner *regexp.Regexp saver changeSetSaver } func (e ChangeSetExtractor) Matches(line string) bool { return e.re.MatchString(line) } func (e ChangeSetExtractor) Extract(metadata *BackupLogMetadata, line string) { // Sample line: "Files: 0 new, 0 changed, 2 unmodified" trimmed := strings.TrimSpace(e.re.ReplaceAllString(line, "")) splitted := strings.Split(trimmed, ",") var changeset BackupLogMetadataChangeset = BackupLogMetadataChangeset{} changeset.Added = e.cleaner.ReplaceAllString(splitted[0], "") changeset.Changed = e.cleaner.ReplaceAllString(splitted[1], "") changeset.Unmodified = e.cleaner.ReplaceAllString(splitted[2], "") e.saver.Save(metadata, changeset) } type changeSetSaver interface { Save(metadata *BackupLogMetadata, changeset BackupLogMetadataChangeset) } type fileSaver struct{} func (f fileSaver) Save(metadata *BackupLogMetadata, changeset BackupLogMetadataChangeset) { metadata.Files = changeset } type dirsSaver struct{} func (d dirsSaver) Save(metadata *BackupLogMetadata, changeset BackupLogMetadataChangeset) { metadata.Dirs = changeset } func NewFilesExtractor() MetadatExtractor { return ChangeSetExtractor{ re: regexp.MustCompile(`(?i)^Files:`), cleaner: regexp.MustCompile(`[^\d]`), saver: fileSaver{}, } } func NewDirsExtractor() MetadatExtractor { return ChangeSetExtractor{ re: regexp.MustCompile(`(?i)^Dirs:`), cleaner: regexp.MustCompile(`[^\d]`), saver: dirsSaver{}, } }