package obiformats import ( "fmt" "io" "os" log "github.com/sirupsen/logrus" "git.metabarcoding.org/obitools/obitools4/obitools4/pkg/obiiter" ) func WriteSequence(iterator obiiter.IBioSequence, file io.WriteCloser, options ...WithOption) (obiiter.IBioSequence, error) { ok := iterator.Next() if ok { batch := iterator.Get() iterator.PushBack() var newIter obiiter.IBioSequence var err error if len(batch.Slice()) > 0 { if batch.Slice()[0].HasQualities() { newIter, err = WriteFastq(iterator, file, options...) } else { newIter, err = WriteFasta(iterator, file, options...) } } else { newIter, err = WriteFasta(iterator, file, options...) } return newIter, err } if iterator.Finished() { return iterator, nil } return obiiter.NilIBioSequence, fmt.Errorf("input iterator not ready") } func WriteSequencesToStdout(iterator obiiter.IBioSequence, options ...WithOption) (obiiter.IBioSequence, error) { // options = append(options, OptionDontCloseFile()) options = append(options, OptionCloseFile()) return WriteSequence(iterator, os.Stdout, options...) } func WriteSequencesToFile(iterator obiiter.IBioSequence, filename string, options ...WithOption) (obiiter.IBioSequence, error) { opt := MakeOptions(options) flags := os.O_WRONLY | os.O_CREATE if opt.AppendFile() { flags |= os.O_APPEND } else { flags |= os.O_TRUNC } file, err := os.OpenFile(filename, flags, 0660) if err != nil { log.Fatalf("open file error: %v", err) return obiiter.NilIBioSequence, err } options = append(options, OptionCloseFile()) iterator, err = WriteSequence(iterator, file, options...) if opt.HaveToSavePaired() { var revfile *os.File revfile, err = os.OpenFile(opt.PairedFileName(), flags, 0660) if err != nil { log.Fatalf("open file error: %v", err) return obiiter.NilIBioSequence, err } iterator, err = WriteSequence(iterator.PairedWith(), revfile, options...) } return iterator, err }