That, rather than just a couple of values from it. Primarily because we
want to not have callers involve themselves with the value context
unless they want to.
- ifd_tag_entry.go: ITEs now provide `Format()` and `FormatFirst()`
methods.
- We dumped several spots of code that could just reuse functions to
format, decode, or get raw bytes rather than dealing with undefined
vs not undefined logic themselves.
- This is now possible due to prior change.
- ifd_tag_entry.go: No longer exports GetValueContext(). Users shouldn't
usually have to touch it, now.
- Added some commenting.
This commit almost represents everything we have been trying to achieve,
now made possible by the last several commits.
They'll also now embed all of the information they need to know since it
is all known where the ITEs are created. This prevents the user from
having to be involved in it. This makes it much more straightforward and
enjoyable to use.
- ifd_tag_entry.go
- newIfdTagEntry now takes and embeds `addressableBytes` and
`byteOrder`.
- We've dumped the `value` member that let the caller preload a parsed
value (or bytes?). It's no longer necessary since this led to
inconsistencies and the ITE can produce these values directly, now.
- `Value()` obviously no longer takes `addressableValue` and
`byteOrder` since now embedded.
- `Value()` will now see and return ErrUnhandledUnknownTypedTag
directly (not wrapping it, since this is a handled case).
- common/type.go: FormatFromType now uses Stringer as a fallback if
possible. All undefined-tag wrapper types implement it, so the same
function can handle both undefined and non-undefined values, and the
individual types can control the strings presented in simple listing.
- Dropped "resolveValue" parameters from all of the collect, visit, and
parsing functions. Resolution is now a later step performed by the
caller on the ITEs, directly.
- This parameter was protection against undefined-type values
disrupting simple enumeration, but now the user can simply produce
the list of tags and can either choose to decode their value or not,
directly. If they do, they, as of earlier, recent commits, also have
the ability to properly manage unhandled undefined-values so they
don't crash.
- The ITEs can now create ValueContext structs directly
(GetValueContext()), though it might not be necessary now that the
ITEs can produce the values and encodings directly.
- This also allowed us to dump several other GetValueContext()
implementations elsewhere since it is now self-reliant on this type
and those methods were essentially kludges for the lack of this.
- Dump a bunch of "Value" methods from ITEs which just weren't useful or
simple enough. Replaced by the above.
- Fixed `(Ifd).String()` to have a pointer receiver.
We need this to not run unless we're in a testing context. This is prep
for module support, where the relative path required there only works in
this package but will fail if used in reads in an `init()` function upon
import from subpackages.
This reverts commit 4f2f9044e6.
Reintroduces errors from `UndefinedValue()` when the undefined-type is
unhandled.
- We now just return it rather than panic with it so that we can check
for it directly rather than use `log.Is()`.
- We've updated the checks across the code accordingly.
Per our recent change to deimplement ITEVRs.
- ifd_enumerate_test.go: Fixed some test naming.
- ifd_builder_test.go: Dropped some now-unnecessary implementations of
ITEVRs.
This was an early way of resolving tag values that is now obsolete.
`ValueContext` structs should be used, and these, in many cases, should
be able to be constructed from the current context without passing
additional arguments.
- ifd_builder_test.go: Refactors to several tests due to loss of ITEVR support.
- ifd_builder_encode_test.go: Moved test-IB populate to testing_common.go .
- ifd_builder.go: Fixed test naming (in most cases, omitted type name).
This allows us to add an API for accessing an undefined-value/structure
directly on ValueContext.
- ifd_tag_entry.go: Fixed several methods on `IfdTagEntry` to be by-
reference. It was a latent bug that they weren't.
- value_context.go: Added `newValueContextFromTag` to streamline
the changes above.
The upshot of this is that generating a list of type-correct slices or a
string from a tag's value is now stupidly easy.
- Broke parsing into an independent type (parser.go:Parser).
- Moved primary value-processing logic to `ValueContext` so that it
coexists with the actual data (though as much basic functionality as
possible is implemented independently and reused here). This
eliminates extremely ridiculously obtuse usage procedure.
- Deprecated almost all existing TagType functionality (in order to
distance us from this now-legacy usage pattern). Existing
functionality maintained for now. We'll drop it when we do the next
release major.
- `ValueContext` is now passed by reference.
Added a `Size()` method to it and decommissioned redundant
`TagTypeSize()` and `(TagType).Size()`.
- ifd_enumerate.go: Moved `ValueContext` definition to
value_context.go .
- ifd_builder.go
- `BuilderTag` now embeds `ByteOrder`.
- `BuilderTag` `String()` now prints value.
- type.go
- `TagType` `ValueIsEmbedded()` renamed to `valueIsEmbedded()`.
- Add `readRawEncoded()` method to `TagType`.
- Add `Format()` method to `TagType` to isolate code for processing
output strings for all types.
- This will also print a suffixing ellipsis when `justFirst` is
`true`.
- Important bugfix for embedded values always being presented as
four-bytes rather than being truncated to their reported unit-count
bytes first. We tripped over this when some of our corresponding
math was found to be wrong elsewhere.
- Minor reformatting.
- tags_unknown.go: Unhandled unknown values are now wrapped in a
TagUnknownType_UnknownValue rather than returning an error. This is
now used to print byte-counts and SHA1s for unhandled values.
- tags_unknown.go: UnparseableUnknownTagValuePlaceholder now has message
"!UNKNOWN" rather than "!UNPARSEABLE".