Module: Ibex::CLIDocumentation

Defined in:
lib/ibex/cli/documentation.rb,
sig/ibex/cli/documentation.rbs

Overview

Generates standalone grammar documentation from the canonical include closure.

Instance Method Summary collapse

Instance Method Details

#documentation_option_parser(settings) ⇒ OptionParser

RBS:

  • (documentation_settings settings) -> OptionParser

Parameters:

  • settings (documentation_settings)

Returns:

  • (OptionParser)


55
56
57
58
59
60
61
62
63
64
65
# File 'lib/ibex/cli/documentation.rb', line 55

def documentation_option_parser(settings)
  OptionParser.new do |options|
    options.banner = "Usage: ibex doc [options] grammarfile"
    options.on("--format=FORMAT", Codegen::Documentation::FORMATS, "markdown, html, or railroad") do |value|
      settings[:format] = value
    end
    options.on("-o FILE", "--output=FILE", "write atomically to FILE") { |value| settings[:output] = value }
    options.on("--mode=MODE", %w[default extended], "grammar mode") { |value| settings[:mode] = value.to_sym }
    options.on("--help", "show help") { settings[:help] = true }
  end
end

#reject_documentation_output_collision(output, grammar_files) ⇒ void

This method returns an undefined value.

RBS:

  • (String output, Array[String] grammar_files) -> void

Parameters:

  • output (String)
  • grammar_files (Array[String])


46
47
48
49
50
51
52
# File 'lib/ibex/cli/documentation.rb', line 46

def reject_documentation_output_collision(output, grammar_files)
  collision = grammar_files.find { |grammar_file| same_file_target?(grammar_file, output) }
  return unless collision

  raise Ibex::Error,
        "(cli):1:1: doc input and output paths must be distinct; output aliases grammar source #{collision}"
end

#run_documentation_command(arguments) ⇒ Integer

RBS:

  • (Array[String] arguments) -> Integer

Parameters:

  • arguments (Array[String])

Returns:

  • (Integer)


26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/ibex/cli/documentation.rb', line 26

def run_documentation_command(arguments)
  settings = { format: "markdown", mode: :default } #: documentation_settings
  parser = documentation_option_parser(settings)
  remaining = parser.parse(arguments)
  if settings[:help]
    @stdout.puts(parser)
    return 0
  end

  path = input_path(remaining)
  output = settings[:output]
  resolution = Frontend::Resolver.new(path, mode: settings.fetch(:mode)).resolve
  reject_documentation_output_collision(output, resolution.files) if output
  grammar = Normalizer.new(resolution, mode: settings.fetch(:mode)).normalize
  rendered = Codegen::Documentation.render(grammar, format: settings.fetch(:format))
  output ? atomic_write_ir(output, rendered) : @stdout.write(rendered)
  0
end