- Added new `ErrorType` enum member `INVALID_FORMATTING`
Formatting
- All formatting functions will now throw a `BirchwoodException` instead of a `StringException` on invalid formatting parameters
- Added TODO for import `std.string`
- Added documentation to `SimpleColor` enum
- Added documentation and code-styled `reset_fg_bg()`, `bold(string)`, `italics(string)`, `underline(string)`, `strikethrough(string)` and `monospace(string)`
- Made the `connInfo` field `package` level
- Made the `connInfo` field `shared` meaning access to teh variable (updating the "slot", a.k.a. what struct is stored there) will use a lock
- Updating anything within the struct will use a lock (besides `addrInfo` after returning from `getAddr()`)
- This ensures we can have runtime updates safely
- Added documentation to the constructor
- Added TODO for the destructor
- Re-added `getConnInfo()`
- This practice is good for cases we want to update the struct, as getting it via a function would return a copy
ConnInfo
- `ConnectionInfo` struct must now be marked as `shared` due to `Client.connInfo` being marked as such
- We cast from `shared Address` to `Address` because I don't think there is a lot of mutable data in this anyways (subject to change)
Sender
- The `SenderThread` will now access the client's connection info via the field name (`connInfo`), rather than getting a copy of the struct and then fetching the fakelag
- Commented all of `BirchwoodException`
- Moved `ErrorType` up to the module-level
- Documented `ErrorType` and all of its member enums
Client
- Fixed usage of `ErrorType`
ConnInfo
- Documented `ConnectionInfo`
- Fixed usage of `ErrorType`
- Added `ppPairs` and `getPairs()` which returns a `string[]` of all parameters (excluding trailing)
- Implemented usage of new `splitter(string, ref bool)`
- The `splitter()` function now sets a flag if there is a trailer
Unit tests
- Updated unit test to use new `splitter(string ref bool)`
- Added work-in-progress `parameterParse()` which attempts to parse parameters and trailing text (if any of both)
- Added `ppTrailing` for any possible trailing text
- Added `ppKVPairs` for any potential key-value pairs
- Call `parameterParse()` on initialization of a new `Message` object