Пример #1
0
// 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
}