code: func (s *Scrubber) fields(rv reflect.Value, path Path, callbacks map[string]Path) {
  	for i := 0; i < rv.NumField(); i++ {
  		sf := rv.Type().Field(i)
  		if sf.PkgPath != "" && !sf.Anonymous { // unexported.
  			continue
  		}
  
  		// dnode uses JSON package tags for field naming so we need to
  		// discard their comma-separated options.
  		tag := sf.Tag.Get("json")
  		if idx := strings.Index(tag, ","); idx != -1 {
  			tag = tag[:idx]
  		}
  		if tag == "-" {
  			continue
  		}
  		// do not collect callbacks for "-" tagged fields.
  		if skip := sf.Tag.Get("dnode"); skip == "-" {
  			continue
  		}
  
  		var name = tag
  		if name == "" {
  			name = sf.Name
  		}
  
  		if sf.Anonymous {
  			s.collect(rv.Field(i), path, callbacks)
  		} else {
  			s.collect(rv.Field(i), append(path, name), callbacks)
  		}
  	}
  }
docs: // fields walks over a structure and scrubs its fields.