terminal/doc
Dustin L. Howett 3a5c33b005
Rework JsonUtils' optional handling to let Converters see null (#8175)
The JsonUtils changes in #8018 revealed that we need more robust,
configurable optional handling. We learned that there's a class of
values that was previously underrepresented in our API: _strings that
have an explicit empty value_.

The Settings model supports starting directory, icon, background image
et al values that are empty. That emptiness _overrides_ a value set in a
lower layer, so it is not sufficient to represent the empty value for
any one of those fields as an unset optional.

There are a couple other settings for which we've implemented a
hand-rolled option type (for roughly the same reason): foreground,
background, any color fields that override values from the color scheme
_or_ the lower layer profile.

These requirements are best fulfilled by better optional support in
JsonUtils. Where the library would originally detect known types of
optional and pre-filter them out during `GetValue` and `SetValue`, it
will now defer to another conversion trait.

This commit introduces a helper conversion trait and an "option oracle".
The conversion trait will use the option oracle to detect emptiness,
generate empty option values, and read values out of option types. In so
doing, the trait is insulated from the implementation details of any
specific option type.

Any special logic for handling JSON null and option types has been
stripped from GetValue. Due to this, there is an express change in
behavior for some converters:

* `GetValue<T>(jsonNull)` where `T` is **not** an option type[1] has
  been upgraded from a silent no-op to an exception.

Further, I took the opportunity to replace NullableSetting with
std::optional<std::optional<T>>, which accurately represents "setting
that the user might explicitly clear". I've added a test to
JsonUtilsTests to make sure it can serialize/deserialize double
optionals the way we expect it to.

Tests (Local, Unit for TerminalApp/SettingsModel):
Summary: Total=140, Passed=140, Failed=0, Blocked=0, Not Run=0, Skipped=0

[1]: Explicitly, if `T` is not an option type _and the converter does
not support null_.
2020-11-09 15:13:02 -08:00
..
cascadia Rework JsonUtils' optional handling to let Converters see null (#8175) 2020-11-09 15:13:02 -08:00
images Run all images through ImgBot (#8169) 2020-11-05 18:03:40 -08:00
reference Run all images through ImgBot (#8169) 2020-11-05 18:03:40 -08:00
specs Run all images through ImgBot (#8169) 2020-11-05 18:03:40 -08:00
user-docs doc: add a link to MSYS2's WT profiles page (#8060) 2020-10-27 13:27:00 -07:00
AddASetting.md Fixed typo's and improved consistency. (#704) 2019-05-15 21:02:42 -07:00
bot.md Changed feedback hub request rule (#2680) 2019-09-06 08:55:13 -05:00
building.md docs: use unlikely example versions in nuget package script (#7448) 2020-09-04 13:01:51 -07:00
ConsoleCtrlEvent.md Fixed typo's and improved consistency. (#704) 2019-05-15 21:02:42 -07:00
ConsoleHostSettings.md Added information on WxH character (#2104) 2019-08-01 08:34:18 -05:00
creating_a_new_project.md Remove all our path antics; force native projects to bin/, obj/ (#8062) 2020-10-27 15:00:41 -07:00
Debugging.md doc: Add debugging notes on DebugBreak (#4163) 2020-01-09 17:56:05 -08:00
EXCEPTIONS.md Code highlighting and capitalization fix for doc/EXCEPTIONS.md (#1283) 2019-06-17 23:41:27 +00:00
Niksa.md Add a "shell vs terminal" section to Niksa.md (#7202) 2020-08-06 16:23:54 -05:00
ORGANIZATION.md Fix a bunch of spelling errors across the project (#4295) 2020-02-10 20:40:01 +00:00
STYLE.md Converts Dispatcher().RunAsync to WinRT Coroutines (#4051) 2020-01-10 03:29:49 +00:00
submitting_code.md Prepare for the primary branch name to change to main (#7985) 2020-10-21 17:29:36 -07:00
TAEF.md doc: address how to use TAEF (#7590) 2020-10-14 17:33:12 -07:00
terminal-v1-roadmap.md doc: update roadmap with proper v1 release date (#4860) 2020-03-09 17:04:54 -07:00
terminal-v2-roadmap.md doc: Update roadmap with latest info (#7778) 2020-09-30 20:14:45 -07:00
UniversalTest.md Fixed typo's and improved consistency. (#704) 2019-05-15 21:02:42 -07:00
virtual-dtors.md Fix a bunch of spelling errors across the project (#4295) 2020-02-10 20:40:01 +00:00
WIL.md Fix WIL doc summary (#786) 2019-05-14 13:11:41 -07:00
WindowsTestPasses.md Fixed typo's and improved consistency. (#704) 2019-05-15 21:02:42 -07:00