// Write a single feature and return the number of bytes written and any error. func (w *Writer) Write(f feat.Feature) (n int, err error) { defer func() { if err != nil { return } _, err = w.w.Write([]byte{'\n'}) if err != nil { return } n++ }() // Handle Bed types. if f, ok := f.(Bed); ok { if !f.canBed(w.BedType) { return 0, ErrBadBedType } return fmt.Fprintf(w.w, "%*s", w.BedType, f) } // Handle other feature types. if f.Location() == nil { return 0, ErrNoChromField } // Bed3 n, err = fmt.Fprintf(w.w, "%s\t%d\t%d", f.Location(), f.Start(), f.End()) if w.BedType == 3 { return n, err } // Bed4 _n, err := fmt.Fprintf(w.w, "\t%s", f.Name()) n += _n if w.BedType == 4 || err != nil { return n, err } // Bed5 if f, ok := f.(Scorer); ok { _n, err := fmt.Fprintf(w.w, "\t%d", f.Score()) n += _n if err != nil { return n, err } } else { _n, err := fmt.Fprintf(w.w, "\t0") n += _n if err != nil { return n, err } } if w.BedType == 5 { return } // Bed6 if f, ok := f.(feat.Orienter); ok { _n, err := fmt.Fprintf(w.w, "\t%s", seq.Strand(f.Orientation())) n += _n if err != nil { return n, err } } else { _n, err := fmt.Fprintf(w.w, "\t.") n += _n if err != nil { return n, err } } if w.BedType == 6 || w.BedType == 0 { return } // Don't handle Bed12. _n, err = w.w.Write([]byte{'\n'}) n += _n return n, ErrBadBedType }