package cmd import ( "fmt" "strings" ) // Проверка пути на пустое значение // Принимает на вход экземпляр bodyOutput и возвращает флаг, означающий непустой путь func (o CSVOutput) Enabled() bool { return strings.TrimSpace(o.CSVPath) != "" } // Проверка пути на пустое значение // Принимает на вход экземпляр bodyOutput и возвращает флаг, означающий непустой путь func (o JSONOutput) Enabled() bool { return strings.TrimSpace(o.JSONPath) != "" } // Проверка пути на пустое значение. // Принимает на вход экземпляр bodyOutput и возвращает флаг, означающий непустой путь func (o BodyOutput) Enabled() bool { return strings.TrimSpace(o.BodyPath) != "" } // Валидация флагов // Принимает на вход указатель на экземпляр mftParseCmd и возвращает ошибку func (c *MFTParseCmd) Validate() error { if !c.CSVOutput.Enabled() && !c.JSONOutput.Enabled() && !c.BodyOutput.Enabled() { return fmt.Errorf("mft parse requires at least one output: --csv, --json, or --body") // Проверка на наличие флага формата файла вывода } if c.BodyOutput.Enabled() && strings.TrimSpace(c.DriveLetter) == "" { return fmt.Errorf("--drive-letter is required when using --body") // Проверка наличия буквы диска в Bodyfile } if c.FileList && !c.CSVOutput.Enabled() { return fmt.Errorf("--file-list requires --csv") // Проверка CSV вывода для листинга файлов } if (c.DumpResidentFiles || c.IncludeResidentData) && !c.CSVOutput.Enabled() && !c.JSONOutput.Enabled() { return fmt.Errorf("--dump-resident-files and --include-resident-data require --csv or --json") // Проверка CSV или JSON вывода для резидентных файлов } if c.ResidentMaxBytes <= 0 || c.ResidentMaxBytes > MaxResidentDataBytes { return fmt.Errorf("--resident-max-bytes must be between 1 and %d", MaxResidentDataBytes) // Проверка максимального значения размера резидентных файлов } return nil } // Валидация флагов // Принимает на вход указатель на экземпляр mftShowCmd и возвращает ошибку func (c *MFTShowCmd) Validate() error { return nil } // Валидация флагов // Принимает на вход указатель на экземпляр mftExportRecordCmd и возвращает ошибку func (c *MFTExportRecordCmd) Validate() error { return nil } // Валидация флагов // Принимает на вход указатель на экземпляр journalParseCmd и возвращает ошибку func (c *JournalParseCmd) Validate() error { if !c.CSVOutput.Enabled() && !c.JSONOutput.Enabled() { return fmt.Errorf("j parse requires at least one output: --csv or --json") // Проверка вывода } return nil } // Валидация флагов // Принимает на вход указатель на экземпляр bootParseCmd и возвращает ошибку func (c *BootParseCmd) Validate() error { return nil } // Валидация флагов // Принимает на вход указатель на экземпляр sdsParseCmd и возвращает ошибку func (c *SDSParseCmd) Validate() error { if !c.CSVOutput.Enabled() { return fmt.Errorf("sds parse requires --csv") // Проверка вывода в CSV } return nil } // Валидация флагов // Принимает на вход указатель на экземпляр sdsShowCmd и возвращает ошибку func (c *SDSShowCmd) Validate() error { return nil } // Валидация флагов // Принимает на вход указатель на экземпляр i30ParseCmd и возвращает ошибку func (c *I30ParseCmd) Validate() error { if !c.CSVOutput.Enabled() { return fmt.Errorf("i30 parse requires --csv") // Проверка вывода в CSV } return nil } // Валидация флагов. // Принимает на вход указатель на экземпляр logFileParseCmd и возвращает ошибку func (c *LogFileParseCmd) Validate() error { return nil } // Валидация команд. // Принимает на вход объект и при наличии метода Validate производит валидацию func ValidateLeaf(cmd any) error { switch v := cmd.(type) { case interface{ Validate() error }: return v.Validate() default: return nil } }