The current obj2yaml's output has an issue: it places
a lot of an excessive indentation spaces between keys and values.
Then we have to remove them manually to improve the readability of
test cases. I see such requests from reviewers regularly around
and it is not ideal.
The issue happens because Output::paddedKey has a trivial logic which
hardcodes the maximum of spaces used to align the values column:
const char *spaces = " "; if (key.size() < strlen(spaces)) Padding = &spaces[key.size()];
I've experimented with a ways to improve this situation and
seems finally found the solution, though it is not that simple
as I've hoped when started.
The main problem is that until we performed a mapping of
fields, we know nothing about their names and hence
can't use this information to tweak the indentations on the fly.
At the same time we write the output during doing the mapping,
so it is too late to do something on this step.
So. In this patch I've introduced a "pre-mapping" pass. This is a
cheap "mapping" that is done right before the real mapping.
This pass only scans the keys which are on the current level of the output
and finds the maximum key length. This information is then used
to calculate and print a better indentation during the real mapping pass.
Given that the approach is not that simple, I'd like to discuss before
doing additional polishing. Perhaps the main question is: do we want
such complexity to improve indentations?
Some doxygen-style comments on this and the other new functions and classes are needed.