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.