-
Notifications
You must be signed in to change notification settings - Fork 25
feat: added docgen for doc autogeneration #526
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
shubhexists
wants to merge
7
commits into
sigp:unstable
Choose a base branch
from
shubhexists:cli-docs
base: unstable
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 6 commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
d08f702
feat: added docgen for doc autogeneration
shubhexists 1863c20
Merge branch 'unstable' into cli-docs
shubhexists 93639f9
fix(fmt): cargo fmt
shubhexists 57aaeb0
feat(refactor): moved docs to client/src
shubhexists c34799e
feat(docs): doc changes
shubhexists 841d572
feat(docs): doc changes
shubhexists 956679e
Merge branch 'unstable' into cli-docs
shubhexists File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -48,42 +48,7 @@ fn build_profile_name() -> &'static str { | |
| } | ||
|
|
||
| #[derive(Parser, Clone, Debug)] | ||
| #[clap( | ||
| name = "ssv", | ||
| about = "SSV Validator client. Maintained by Sigma Prime.", | ||
| author = "Sigma Prime <[email protected]>", | ||
| long_version = LONG_VERSION.as_str(), | ||
| version = SHORT_VERSION.as_str(), | ||
| styles = get_color_style(), | ||
| disable_help_flag = true, | ||
| next_line_help = true, | ||
| term_width = 80, | ||
| display_order = 0, | ||
| )] | ||
| pub struct Node { | ||
| #[clap( | ||
| long, | ||
| global = true, | ||
| value_name = "PATH", | ||
| help = "Path to the operator key file. File name needs to end in \ | ||
| `.txt` for unencrypted keys, or `.json` for encrypted keys. \ | ||
| If not provided, Anchor will look for the key in the data dir. \ | ||
| If provided and the file does not exist, Anchor will exit.", | ||
| display_order = 0 | ||
| )] | ||
| pub key_file: Option<PathBuf>, | ||
|
|
||
| #[clap( | ||
| long, | ||
| global = true, | ||
| value_name = "PATH", | ||
| help = "Path to the password used to decrypt the operator private key. \ | ||
| If not provided but required, Anchor will request the password interactively.", | ||
| display_order = 0 | ||
| )] | ||
| pub password_file: Option<PathBuf>, | ||
|
|
||
| // External APIs | ||
| pub struct ExternalApis { | ||
| #[clap( | ||
| long, | ||
| value_name = "NETWORK_ADDRESSES", | ||
|
|
@@ -137,8 +102,10 @@ pub struct Node { | |
| display_order = 0 | ||
| )] | ||
| pub execution_nodes_tls_certs: Option<Vec<PathBuf>>, | ||
| } | ||
|
|
||
| // REST API related arguments | ||
| #[derive(Parser, Clone, Debug)] | ||
| pub struct HttpApi { | ||
| #[clap( | ||
| long, | ||
| help = "Enable the RESTful HTTP API server. Disabled by default.", | ||
|
|
@@ -198,8 +165,52 @@ pub struct Node { | |
| requires = "http" | ||
| )] | ||
| pub http_allow_origin: Option<String>, | ||
| } | ||
|
|
||
| #[derive(Parser, Clone, Debug)] | ||
| pub struct MetricsOptions { | ||
| #[clap( | ||
| long, | ||
| help = "Enable the Prometheus metrics HTTP server. Disabled by default.", | ||
| display_order = 0, | ||
| help_heading = FLAG_HEADER, | ||
| )] | ||
| pub metrics: bool, | ||
|
|
||
| // Network related arguments | ||
| #[clap( | ||
| long, | ||
| value_name = "ADDRESS", | ||
| help = "Set the listen address for the Prometheus metrics HTTP server.", | ||
| default_value_if("metrics", ArgPredicate::IsPresent, "127.0.0.1"), | ||
| display_order = 0, | ||
| requires = "metrics" | ||
| )] | ||
| pub metrics_address: Option<IpAddr>, | ||
|
|
||
| #[clap( | ||
| long, | ||
| value_name = "PORT", | ||
| help = "Set the listen TCP port for the Prometheus metrics HTTP server.", | ||
| display_order = 0, | ||
| default_value_if("metrics", ArgPredicate::IsPresent, "5164"), | ||
| requires = "metrics" | ||
| )] | ||
| pub metrics_port: Option<u16>, | ||
|
|
||
| #[clap( | ||
| long, | ||
| help = "Enable per validator metrics for > 64 validators. \ | ||
| Note: This flag is automatically enabled for <= 64 validators. \ | ||
| Enabling this metric for higher validator counts will lead to higher volume \ | ||
| of prometheus metrics being collected.", | ||
| display_order = 0, | ||
| help_heading = FLAG_HEADER, | ||
| )] | ||
| pub enable_high_validator_count_metrics: bool, | ||
| } | ||
|
|
||
| #[derive(Parser, Clone, Debug)] | ||
| pub struct NetworkOptions { | ||
| #[clap( | ||
| long, | ||
| value_name = "ADDRESS", | ||
|
|
@@ -272,66 +283,6 @@ pub struct Node { | |
| )] | ||
| pub quic_port6: Option<u16>, | ||
|
|
||
| #[clap( | ||
| long, | ||
| help = "Sets all listening TCP/UDP ports to 0, allowing the OS to choose some \ | ||
| arbitrary free ports.", | ||
| action = ArgAction::SetTrue, | ||
| hide = true, | ||
| )] | ||
| pub use_zero_ports: bool, | ||
|
|
||
| // Prometheus metrics HTTP server related arguments | ||
| #[clap( | ||
| long, | ||
| help = "Enable the Prometheus metrics HTTP server. Disabled by default.", | ||
| display_order = 0, | ||
| help_heading = FLAG_HEADER, | ||
| )] | ||
| pub metrics: bool, | ||
|
|
||
| #[clap( | ||
| long, | ||
| value_name = "ADDRESS", | ||
| help = "Set the listen address for the Prometheus metrics HTTP server.", | ||
| default_value_if("metrics", ArgPredicate::IsPresent, "127.0.0.1"), | ||
| display_order = 0, | ||
| requires = "metrics" | ||
| )] | ||
| pub metrics_address: Option<IpAddr>, | ||
|
|
||
| #[clap( | ||
| long, | ||
| value_name = "PORT", | ||
| help = "Set the listen TCP port for the Prometheus metrics HTTP server.", | ||
| display_order = 0, | ||
| default_value_if("metrics", ArgPredicate::IsPresent, "5164"), | ||
| requires = "metrics" | ||
| )] | ||
| pub metrics_port: Option<u16>, | ||
|
|
||
| #[clap( | ||
| long, | ||
| help = "Enable per validator metrics for > 64 validators. \ | ||
| Note: This flag is automatically enabled for <= 64 validators. \ | ||
| Enabling this metric for higher validator counts will lead to higher volume \ | ||
| of prometheus metrics being collected.", | ||
| display_order = 0, | ||
| help_heading = FLAG_HEADER | ||
| )] | ||
| pub enable_high_validator_count_metrics: bool, | ||
| // TODO: Metrics CORS Origin | ||
| // https://github.com/sigp/anchor/issues/249 | ||
| #[clap( | ||
| long, | ||
| global = true, | ||
| help = "Prints help information", | ||
| action = clap::ArgAction::HelpLong, | ||
| display_order = 0, | ||
| help_heading = FLAG_HEADER | ||
| )] | ||
| help: Option<bool>, | ||
|
|
||
| #[clap( | ||
| long, | ||
| global = true, | ||
|
|
@@ -435,38 +386,48 @@ pub struct Node { | |
|
|
||
| #[clap( | ||
| long, | ||
| help = "Disable slashing protection for all validator clients. DO NOT ENABLE THIS UNLESS YOU HAVE A MORE THAN SUFFICIENT REASON TO", | ||
| hide = true, | ||
| display_order = 0 | ||
| help = "Disable the latency measurement service.", | ||
| display_order = 0, | ||
| help_heading = FLAG_HEADER, | ||
| )] | ||
| pub disable_slashing_protection: bool, | ||
| pub disable_latency_measurement_service: bool, | ||
|
|
||
| // debugging stuff | ||
| #[clap( | ||
| long, | ||
| hide = true, | ||
| help = "Act as if we were a certain operator, except for sending messages." | ||
| help = "Disables gossipsub peer scoring.", | ||
| display_order = 0, | ||
| help_heading = FLAG_HEADER, | ||
| )] | ||
| pub impostor: Option<u64>, | ||
| pub disable_gossipsub_peer_scoring: bool, | ||
| } | ||
|
|
||
| // Performance options | ||
| #[derive(Parser, Clone, Debug)] | ||
| pub struct SecurityOptions { | ||
| #[clap( | ||
| long, | ||
| help = "The number of maximum concurrent workers. Defaults to logical cores.", | ||
| hide = true, | ||
| global = true, | ||
| value_name = "PATH", | ||
| help = "Path to the operator key file. File name needs to end in \ | ||
| `.txt` for unencrypted keys, or `.json` for encrypted keys. \ | ||
| If not provided, Anchor will look for the key in the data dir. \ | ||
| If provided and the file does not exist, Anchor will exit.", | ||
| display_order = 0 | ||
| )] | ||
| pub max_workers: Option<usize>, | ||
| pub key_file: Option<PathBuf>, | ||
|
|
||
| #[clap( | ||
| long, | ||
| value_delimiter = ',', | ||
| help = "Override size for a specific queue. Needs to be of the format \"queue_name=42\".", | ||
| hide = true, | ||
| global = true, | ||
| value_name = "PATH", | ||
| help = "Path to the password used to decrypt the operator private key. \ | ||
| If not provided but required, Anchor will request the password interactively.", | ||
| display_order = 0 | ||
| )] | ||
| pub work_queue_size: Vec<String>, | ||
| pub password_file: Option<PathBuf>, | ||
| } | ||
|
|
||
| #[derive(Parser, Clone, Debug)] | ||
| pub struct PayloadBuildingOptions { | ||
| #[clap( | ||
| long, | ||
| value_name = "INTEGER", | ||
|
|
@@ -486,7 +447,7 @@ pub struct Node { | |
| headers during proposals and will sign over headers. Useful for outsourcing \ | ||
| execution payload construction during proposals.", | ||
| display_order = 0, | ||
| help_heading = FLAG_HEADER | ||
| help_heading = FLAG_HEADER, | ||
| )] | ||
| pub builder_proposals: bool, | ||
|
|
||
|
|
@@ -507,25 +468,97 @@ pub struct Node { | |
| help = "If this flag is set, Anchor will always prefer blocks \ | ||
| constructed by builders, regardless of payload value.", | ||
| display_order = 0, | ||
| help_heading = FLAG_HEADER | ||
| help_heading = FLAG_HEADER, | ||
| )] | ||
| pub prefer_builder_proposals: bool, | ||
| } | ||
|
|
||
| #[derive(Parser, Clone, Debug)] | ||
| #[clap( | ||
| name = "ssv", | ||
| about = "SSV Validator client. Maintained by Sigma Prime.", | ||
| author = "Sigma Prime <[email protected]>", | ||
| long_version = LONG_VERSION.as_str(), | ||
| version = SHORT_VERSION.as_str(), | ||
| styles = get_color_style(), | ||
| disable_help_flag = true, | ||
| next_line_help = true, | ||
| term_width = 80, | ||
| display_order = 0, | ||
| )] | ||
| pub struct Node { | ||
| #[clap(flatten)] | ||
| pub security_options: SecurityOptions, | ||
|
|
||
| #[clap(flatten)] | ||
| pub external_apis: ExternalApis, | ||
|
|
||
| #[clap(flatten)] | ||
| pub http_api: HttpApi, | ||
|
|
||
| #[clap(flatten)] | ||
| pub metrics_options: MetricsOptions, | ||
|
|
||
| #[clap(flatten)] | ||
| pub network_options: NetworkOptions, | ||
|
|
||
| #[clap(flatten)] | ||
| pub payload_building_options: PayloadBuildingOptions, | ||
|
|
||
| #[clap( | ||
| long, | ||
| help = "Disable the latency measurement service.", | ||
| display_order = 0, | ||
| help_heading = FLAG_HEADER | ||
| help = "Sets all listening TCP/UDP ports to 0, allowing the OS to choose some \ | ||
| arbitrary free ports.", | ||
| action = ArgAction::SetTrue, | ||
| hide = true, | ||
| )] | ||
| pub disable_latency_measurement_service: bool, | ||
| pub use_zero_ports: bool, | ||
|
|
||
| // TODO: Metrics CORS Origin | ||
| // https://github.com/sigp/anchor/issues/249 | ||
| #[clap( | ||
| long, | ||
| help = "Disables gossipsub peer scoring.", | ||
| global = true, | ||
| help = "Prints help information", | ||
| action = clap::ArgAction::HelpLong, | ||
| display_order = 0, | ||
| help_heading = FLAG_HEADER | ||
| )] | ||
| pub disable_gossipsub_peer_scoring: bool, | ||
| help: Option<bool>, | ||
|
|
||
| #[clap( | ||
| long, | ||
| help = "Disable slashing protection for all validator clients. DO NOT ENABLE THIS UNLESS YOU HAVE A MORE THAN SUFFICIENT REASON TO", | ||
| hide = true, | ||
| display_order = 0 | ||
| )] | ||
| pub disable_slashing_protection: bool, | ||
|
|
||
| // debugging stuff | ||
| #[clap( | ||
| long, | ||
| hide = true, | ||
| help = "Act as if we were a certain operator, except for sending messages." | ||
| )] | ||
| pub impostor: Option<u64>, | ||
|
|
||
| // Performance options | ||
| #[clap( | ||
| long, | ||
| help = "The number of maximum concurrent workers. Defaults to logical cores.", | ||
| hide = true, | ||
| display_order = 0 | ||
| )] | ||
| pub max_workers: Option<usize>, | ||
|
|
||
| #[clap( | ||
| long, | ||
| value_delimiter = ',', | ||
| help = "Override size for a specific queue. Needs to be of the format \"queue_name=42\".", | ||
| hide = true, | ||
| display_order = 0 | ||
| )] | ||
| pub work_queue_size: Vec<String>, | ||
|
|
||
| #[clap(long, help = "Disables gossipsub topic scoring.", hide = true)] | ||
| pub disable_gossipsub_topic_scoring: bool, | ||
|
|
||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we need to add keysplit?
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agree. It would be nicer to have the docgen as a separate binary target of the top level crate IMO.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi what would be better, a separate binary target for docgen or have a top level library crate that it then called into the main anchor binary as a CLI command?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
My recommendation: make docgen a separate workspace binary (e.g. tools/docgen) rather than an anchor client subcommand. This keeps the shipping CLI lean, avoids linking extra deps (e.g., keysplit) into the client crate.
Sketch:
• tools/docgen/Cargo.toml (bin = docgen)
• Depends on the crates that define the clap trees (e.g. anchor-client, keygen, keysplit) via path = "../anchor/client" etc.
• Each of those crates exposes a small pub fn cli() -> clap::Command (or impl CommandFactory) so docgen can introspect without booting the whole app.