ConfigDocs holds the descriptions and details of a ConfigDescriptor
which can be used to produce documentation.
Every ConfigSource at the core is just a Reader,
which is essentially a function that goes from PropertyTreePath to an actual PropertyTree.
Every ConfigSource at the core is just a Reader,
which is essentially a function that goes from PropertyTreePath to an actual PropertyTree.
i.e, f: PropertyTreePath[String] => IO[ReadError[String], PropertyTree[String, String]
Later on for each key represented as PropertyTreePath[String] internally, f is used to
applied to get the value as a PropertyTree itself.
Internal details:
This function f can be retrieved under an ZManaged effect. This implies it may involve an IO with managing resources
to even form this function. Example: In order to retrieve a property-tree corresponding to a key (PropertyTreePath),
it requires a database connection in the very first instance.
// pseudo-logic, doesn't compile
val source: ConfigSource = ConfigSource.Reader( ZManaged(getDatabaseConnection) .flatMap(connection => (key: PropertyTreePath[String] => IO.effect(connection.getStatement.executeQuery(s"get key from table"))) )
Note that ConfigSource has a generalised memoize function that allows you to memoize the effect required to form the
function. In the context of the above example, with source.memoize we acquire only a single connection to retrieve
the values for all the keys in your product/coproduct for an instance of read.
A Table is a recursive structure that is more easier to be interpreted as Json or Markdown than trying
to convert ConfigDocs to a readable format.
Generate documentation based on the ConfigDescriptor, where a
ConfigDescriptor is a structure representing the logic to fetch the application config
from various sources.
Generate documentation based on the ConfigDescriptor, where a
ConfigDescriptor is a structure representing the logic to fetch the application config
from various sources.
Once we generate the docs, this can be converted to a light weight Table structure which is much more easier to be converted
to markdown or json formats.
Example :
val configDescriptor: ConfigDescriptor[MyAppConfig] = ???
generatedDocs(configDescriptor).toTable.toGithubFlavouredMarkdown
Generate a report based on the ConfigDescriptor and an A, where a
ConfigDescriptor represents the logic to fetch the application config
from various sources, and A represents the actual config value that was retrieved.