# Documentation structure

## Types of pages

Subjects are organized into "container" pages, which can contain both container pages and "class" pages.\
Container pages are basically just pages that contain other pages. Class pages on the other hand document actual classes. The top-level container pages contain a tutorial explaining specific subjects (Guilds, Channels, etc.).

Class pages follow 1 of these formats:

{% content-ref url="enum-pages" %}
[enum-pages](enum-pages)
{% endcontent-ref %}

{% content-ref url="class-pages" %}
[class-pages](class-pages)
{% endcontent-ref %}

## Optional properties/parameters

Sometimes, certain class properties or method parameters are optional. To mark this, the 'Type' column of one of the tables have a '?' added, following c#'s [Nullable value types](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/nullable-value-types).

{% content-ref url="class-pages" %}
[class-pages](class-pages)
{% endcontent-ref %}

## Format of subject-specific tutorials

### References

#### Methods

Methods will be referenced using the format {class}.{method}(), with {class} removed if

* It's clear from context, i.e. that the class has already been referenced.
* The method is exposed, i.e. that it's callable from clients.
* If it's a method that can be called from multiple classes, with that being the intended reference of the method.

#### Documentation links

Links to relevant pages in the docs, whether that would be a tutorial or a class, can be found at the bottom of a tutorial section. Unfortunately, due to the way GitBook works, i cannot specify the section.

### Common methods

The methods .Update(), .Modify() and .Delete() are really common among API-bound classes, and will therefore not be in the tutorials unless i want to explain a "quirk" with one of them. The same can be said for the .GetX() and .CreateX() methods (X being an object like Channel, Guild, etc.). Instead, placeholders are used.

#### Property classes

An object's .Modify() method usually has a 'Properties' class as a parameter. These property classes basically just have a set of optional values that will be applied to the object.

### Simplifications

#### Placeholders

To simplify the subject-specific tutorials, placeholders are used. For example, instead of each channel example calling .GetChannel(), they can just use 'channel'.

Here's a list of the placeholders that will be used:

* guild: MinimalGuild
* channel: MinimalChannel or MinimalTextChannel, clear from context
* hook: DiscordWebhook
* member: GuildMember

The placeholders can either be of the type specified above, or one of the classes it derives. If the type isn't clear from context, it will be stated explicitly.

#### Enums

Often, only the member of the enum is referenced. This will be done whenever the enum type is known from context. An example of this is the ChannelType enum, where i might just specify Text or Group.

{% content-ref url="../documentation/guilds" %}
[guilds](../documentation/guilds)
{% endcontent-ref %}

{% content-ref url="../documentation/channels" %}
[channels](../documentation/channels)
{% endcontent-ref %}
