sequence.go
func (s *FileSequence) Frame(frame interface{}) (string, error) {
	var zframe string
	var isInt bool

	if s.frameSet != nil {
		switch t := frame.(type) {
		case int:
			var i int = t
			zframe = zfillInt(i, s.zfill)
			isInt = true
		case string:
			zframe = t
		case []byte:
			zframe = string(t)
		case fmt.Stringer:
			zframe = t.String()
		default:
			return zframe, fmt.Errorf("%v is not a valid int/string type", t)
		}
		// Only try and zfill the string if it was an int format
		if !isInt {
			if _, err := strconv.Atoi(zframe); err == nil {
				zframe = zfillString(zframe, s.zfill)
			}
		}
	}

	var buf strings.Builder
	buf.WriteString(s.dir)
	buf.WriteString(s.basename)
	buf.WriteString(zframe)
	buf.WriteString(s.ext)
	return buf.String(), nil
}
func (s *FileSequence) Frame(frame interface{}) (string, error) {
	var zframe string
	var isInt bool

	if s.frameSet != nil {
		switch t := frame.(type) {
		case int:
			var i int = t
			zframe = zfillInt(i, s.zfill)
			isInt = true
		case string:
			zframe = t
		case []byte:
			zframe = string(t)
		case fmt.Stringer:
			zframe = t.String()
		default:
			return zframe, fmt.Errorf("%v is not a valid int/string type", t)
		}
		// Only try and zfill the string if it was an int format
		if !isInt {
			if _, err := strconv.Atoi(zframe); err == nil {
				zframe = zfillString(zframe, s.zfill)
			}
		}
	}

	var buf strings.Builder
	buf.WriteString(s.dir)
	buf.WriteString(s.basename)
	buf.WriteString(zframe)
	buf.WriteString(s.ext)
	return buf.String(), nil
}
/*
Frame returns a path to the given frame in the sequence.  Integer or string
digits are treated as a frame number and padding is applied, all other values
are passed though. Accepts ints, strings, []byte, and Stringer types

Example:

	seq.Frame(1)
	>> /foo/bar.0001.exr

	seq.Frame("#")
	>> /foo/bar.#.exr
*/