# gdnative-doc
[![MIT license](https://img.shields.io/badge/License-MIT-green.svg)](https://github.com/arnaudgolfouse/gdnative-doc-rs/blob/main/LICENSE)
[![Latest Version](https://img.shields.io/crates/v/gdnative-doc.svg)](https://crates.io/crates/gdnative-doc)
[![Docs Status](https://docs.rs/gdnative-doc/badge.svg)](https://docs.rs/gdnative-doc)
This is a documentation tool for [godot-rust](https://github.com/godot-rust/godot-rust) projects.
**WARNING:** very unstable at the moment.
The goal of this tool is to automate writing documentation in Rust code that will be used in gdscript.
## Features
- Keep the documentation synchronized with your code.
- Generate readable and easy to change markdown
- Build table of contents automatically.
- Automatic linking to the [godot documentation](https://docs.godotengine.org/en/stable/index.html).
- Generate [gut](https://github.com/bitwes/Gut) tests from gdscript examples.
## Example
An example: `process` function
- Input: Rust
````rust
/// Process the given [`String`], returning [`FAILED`] on error.
///
/// # Example
/// ```gdscript
/// var processor = Myprocessor.new()
/// assert_eq(processor.process("hello"), OK)
/// ```
#[method]
pub fn process(&mut self, _: &Node, s: GodotString) -> i32 { /* ... */ }
````
- Output: Markdown
````markdown
### func process(s: [String]) -> [int]
Process the given [`String`], returning [`FAILED`] on error.
#### Example
```gdscript
var processor = Myprocessor.new()
assert_eq(processor.process("hello"), OK)
```
[string]: https://docs.godotengine.org/en/stable/classes/class_string.html
[`string`]: https://docs.godotengine.org/en/stable/classes/class_string.html
[int]: https://docs.godotengine.org/en/stable/classes/class_int.html
[`failed`]: https://docs.godotengine.org/en/stable/classes/class_@globalscope.html#enum-globalscope-error
````
- Output: Gut
```gdscript
func test_process():
var processor = Myprocessor.new()
assert_eq(processor.process("hello"), OK)
```
A more complete example can be found in the [examples/dijkstra-map-gd](examples/dijkstra-map-gd) directory.
## Usage
This is meant to be used as a [build script](https://doc.rust-lang.org/cargo/reference/build-scripts.html): Set
```toml
[build-dependencies]
gdnative-doc = "*"
```
In your Cargo.toml. Then you can drive the process with the `Builder` structure:
```rust
// in build.rs
use gdnative_doc::{backend::BuiltinBackend, init_logger, Builder, LevelFilter};
use std::path::PathBuf;
fn main() -> Result<(), Box> {
init_logger(LevelFilter::Info)?;
Builder::new()
.add_backend(BuiltinBackend::Markdown, PathBuf::from("doc/markdown"))
.build()?;
Ok(())
}
```
More informations can be found in the [documentation](https://docs.rs/gdnative-doc).
The format of the configuration file can be found [here](configuration_file-format.md).
You can also use the [command-line tool](gdnative-doc-cli).
### Godot version
Supported godot versions are `3.2`, `3.3`, `3.4` and `3.5`. By default, `3.5` will be selected. To select another version, use the `godot_version` field of the configuration file.
## Limitations
At the moment, [syn](https://crates.io/crates/syn) is used to parse rust and search for the `struct` and `impl`s. This is not optimal however and might sometime mess up link resolution.
[rust-analyzer](https://github.com/rust-analyzer/rust-analyzer) libraries will probably be used in the future to avoid this.