summaryrefslogtreecommitdiffstats
path: root/doc/src/03010-conventions.md
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src/03010-conventions.md')
-rw-r--r--doc/src/03010-conventions.md73
1 files changed, 54 insertions, 19 deletions
diff --git a/doc/src/03010-conventions.md b/doc/src/03010-conventions.md
index 3951f756..f6ff3016 100644
--- a/doc/src/03010-conventions.md
+++ b/doc/src/03010-conventions.md
@@ -1,58 +1,93 @@
# Conventions, best practices
-This section goes about best practices in the imag codebase. It is mainly focused on developers, but a user may read it for getting to know how imag works.
+This section goes about best practices in the imag codebase. It is mainly
+focused on developers, but a user may read it for getting to know how imag
+works.
-Lets work our way up from the store and how to extend it to the commandline user interface.
+Lets work our way up from the store and how to extend it to the commandline user
+interface.
## Store and Entry functionality
-A `Entry` does not offer much functionality by itself. So its the job of libraries to _extend_ their functionality. This should never be done by wrapping the `Entry` type itself but by providing and implementing an extension trait on it.
+A `Entry` does not offer much functionality by itself. So its the job of
+libraries to _extend_ their functionality. This should never be done by wrapping
+the `Entry` type itself but by providing and implementing an extension trait on
+it.
-Same goes for extending the `Store` type: never wrap it, always provide an extension trait for it.
+Same goes for extending the `Store` type: never wrap it, always provide an
+extension trait for it.
-These two rules ensure that the type does not lose any functionality from a wrapping. `Deref` could do that, but not over muliple levels, so extension traits it is. It also most likely results in functions inside the extension trait which all return a `Result<_, _>`.
+These two rules ensure that the type does not lose any functionality from a
+wrapping. `Deref` could do that, but not over muliple levels, so extension
+traits it is. It also most likely results in functions inside the extension
+trait which all return a `Result<_, _>`.
## Libraries
-In the next few sections, conventions and best practices for writing a imag library are written down.
+In the next few sections, conventions and best practices for writing a imag
+library are written down.
-A developer of imag should read this carefully, a user may skip this section or cross-read it for better understanding of the imag project.
+A developer of imag should read this carefully, a user may skip this section or
+cross-read it for better understanding of the imag project.
### Library naming
-Libraries which provide functionality for entries or the store (most likely entries or both) should be named "libimagentrything" whereas "thing" stands for what the library provides.
+Libraries which provide functionality for entries or the store (most likely
+entries or both) should be named "libimagentrything" whereas "thing" stands for
+what the library provides.
-All other libraries should be prefixed with "libimag" at least. Most likely, one will not write such a library but rather a "libimagentrything" library.
+All other libraries should be prefixed with "libimag" at least. Most likely, one
+will not write such a library but rather a "libimagentrything" library.
### Library scope
-A library should never introduce utility functionality which could be useful for other libraries as well. If there is no such functionality available, the "libimagutil" might be a place where such a function would be put, or, if not yet available, a "libimagentryutil" could be created.
+A library should never introduce utility functionality which could be useful for
+other libraries as well. If there is no such functionality available, the
+"libimagutil" might be a place where such a function would be put, or, if not
+yet available, a "libimagentryutil" could be created.
-If a library has to introduce free functions in its public interface, one should think hard whether this is really necessary.
+If a library has to introduce free functions in its public interface, one should
+think hard whether this is really necessary.
### Library error types/kinds
-Libraries must use the "libimagerror" tools to create error types and kinds. Most likely, a library needs some kinds for wrapping the errors from underlying libraries, such as the store itself.
+Libraries must use the "libimagerror" tools to create error types and kinds.
+Most likely, a library needs some kinds for wrapping the errors from underlying
+libraries, such as the store itself.
-A library must _never_ introduce multiple error types, but is free to introduce as many error kinds as required. Indeed, more kinds is better than fewer.
+A library must _never_ introduce multiple error types, but is free to introduce
+as many error kinds as required. Indeed, more kinds is better than fewer.
### Libraries with commandline frontends
-Libraries with commandline frontends provide end-user functionality. Normally, they depend on one or more "libimagentrything" libraries. They should be named "libimagthing", though. For example: "libimagdiary", "libimagtimetrack" or "libimagwiki", whereas the commandline frontends would be "imag-diary", "imag-timetrack" and "imag-wiki", respectively.
+Libraries with commandline frontends provide end-user functionality. Normally,
+they depend on one or more "libimagentrything" libraries. They should be named
+"libimagthing", though. For example: "libimagdiary", "libimagtimetrack" or
+"libimagwiki", whereas the commandline frontends would be "imag-diary",
+"imag-timetrack" and "imag-wiki", respectively.
-If such a library needs to depend on another "libimagthing", for example if "libimagdiary" needs to depend on "libimagnote", one should think about this and whether the functionality could ve outsourced to a more general "libimagentrything". It is not forbidden, though.
+If such a library needs to depend on another "libimagthing", for example if
+"libimagdiary" needs to depend on "libimagnote", one should think about this and
+whether the functionality could ve outsourced to a more general
+"libimagentrything". It is not forbidden, though.
-A library which implements a functionality for imag may contain helper functions for commandline stuff, but that is discouraged.
+A library which implements a functionality for imag may contain helper functions
+for commandline stuff, but that is discouraged.
### Library testing
-All libraries should be tested as much as possible. Sometimes it may not be possible without a lot of effort, but still: more tests = better!
+All libraries should be tested as much as possible. Sometimes it may not be
+possible without a lot of effort, but still: more tests = better!
## Commandline tools
-The next few sections describe how the commandline frontends are implemented. Each imag functionality (or module) has its own library and a commandline frontend for it.
+The next few sections describe how the commandline frontends are implemented.
+Each imag functionality (or module) has its own library and a commandline
+frontend for it.
-The commandline frontends do contain little to no functionality. They simply translate the commandline parameters and options to calls to the appropriate library functions.
+The commandline frontends do contain little to no functionality. They simply
+translate the commandline parameters and options to calls to the appropriate
+library functions.
## Commandline tool testing