hashicorp / hashicorp/terraform-plugin-docs

Improve documentation of `object` type for provider-defined functions

Open
#333 0 comments 2 reactions 0 assignees View on GitHub
enhancement
Dominant language
Go
Stars
263
Forks
84
Avg merge
3d 6h
Merged PRs (30d)
2

Description

### Terraform CLI and terraform-plugin-docs Versions

`github.com/hashicorp/terraform-plugin-docs v0.18.0`

### Use Cases or Problem Statement

Currently, when documenting a provider-defined function that has an object as a parameter or return type, there is no mechanism that documents the attributes of said object.

### Provider Schema
```json
{
"functions": {
"rfc3339_parse": {
"description": "Given an RFC3339 timestamp string, will parse and return an object representation of that date and time.",
"summary": "Parse an RFC3339 timestamp string",
"return_type": [
"object",
{
"day": "number",
"hour": "number",
"iso_week": "number",
"iso_year": "number",
"minute": "number",
"month": "number",
"month_name": "string",
"second": "number",
"unix": "number",
"weekday": "number",
"weekday_name": "string",
"year": "number",
"year_day": "number"
}
],
"parameters": [
{
"name": "timestamp",
"description": "RFC3339 timestamp string to parse",
"type": "string"
}
]
}
}
}
```

### Documentation Output
The output currently just prints `object` with no indication of what attributes are available.
``````markdown
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "rfc3339_parse function - terraform-provider-time"
subcategory: ""
description: |-
Parse an RFC3339 timestamp string
---

# function: rfc3339_parse

Given an RFC3339 timestamp string, will parse and return an object representation of that date and time.

## Signature

```text
rfc3339_parse(timestamp string) object
```

## Arguments

1. `timestamp` (String) RFC3339 timestamp string to parse
``````

### Workaround
Currently, you'll need to document the object manually with a template, but that's only really an "escape hatch" solution and not ideal for the broader ecosystem. Example template for `rfc3339_parse`:

``````markdown
page_title: "{{.Name}} {{.Type}} - {{.ProviderName}}"
subcategory: ""
description: |-
{{ .Summary | plainmarkdown | trimspace | prefixlines " " }}
---

# {{.Type}}: {{.Name}}

{{ .Description | trimspace }}

{{ if .HasExample -}}
## Example Usage

{{tffile .ExampleFile }}
{{- end }}

## Signature

{{ .FunctionSignatureMarkdown }}

## Arguments

{{ .FunctionArgumentsMarkdown }}
{{ if .HasVariadic -}}
{{ .FunctionVariadicArgumentMarkdown }}
{{- end }}

## Return Type

The `object` returned from `rfc3339_parse` has the following attributes:
- `year` (Number) The year for the timestamp.
- `year_day` (Number) The day of the year for the timestamp, in the range [1, 365] for non-leap years, and [1, 366] in leap years.
- `day` (Number) The day of the month for the timestamp.
- `month` (Number) The month of the year for the timestamp.
- `month_name` (String) The name of the month for the timestamp (ex. "January").
- `weekday` (Number) The day of the week for the timestamp.
- `weekday_name` (String) The name of the day for the timestamp (ex. "Sunday").
- `hour` (Number) The hour within the day for the timestamp, in the range [0, 23].
- `minute` (Number) The minute offset within the hour for the timestamp, in the range [0, 59].
- `second` (Number) The second offset within the minute for the timestamp, in the range [0, 59].
- `unix` (Number) The number of seconds elapsed since January 1, 1970 UTC.
- `iso_year` (Number) The ISO 8601 year number.
- `iso_week` (Number) The ISO 8601 week number.
``````

### Proposal

Once available downstream introduce logic to generate a section for `object` type attributes, similar to nested attributes in resources/data source documentation.

### Downstream Dependency

Currently, `terraform-plugin-docs` relies on the `terraform providers schema -json` command, which relies on the `GetProviderSchema` RPC. These RPCs typically only contain information that is relevant to Terraform operations and sometimes don't contain enough information for downstream tools like this doc generator or the Terraform language server. In this case, the RPC does not contain a `description` field for each attribute in an object.

Similar issues that are blocked by this dependency on the `GetProviderSchema` RPC:
- https://github.com/hashicorp/terraform-plugin-docs/issues/156
- https://github.com/hashicorp/terraform-plugin-docs/issues/64

### How much impact is this issue causing?

Low

### Additional Information

_No response_

### Code of Conduct

- [X] I agree to follow this project's Code of Conduct

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.