# frozen_string_literal: true require_relative '../../command' require_relative '../../utils/constants' require 'tty-markdown' require 'tty-prompt' require 'base64' module Dri module Commands class Fetch class Runbooks < Dri::Command def initialize(options) @options = options end def execute(folder: nil, _input: $stdin, output: $stdout) return fetch_summary(output: output) unless folder fetch_runbook("#{folder}/index.md", output: output) end def fetch_summary(output:) logger.info 'Fetching runbooks' prompt = TTY::Prompt.new runbooks = api_client.list_runbooks return output.puts 'No runbooks could be found' if runbooks.empty? choices = runbooks.map(&:path) path = prompt.select('Which runbook would you like to look at?', choices) fetch_runbook("#{path}/index.md", output: output) end def fetch_runbook(path, output:) runbook = nil spinner.run do runbook = api_client.get_file( path, ref: 'main', project_id: Utils::Constants::ProjectIDs::RUNBOOKS_PROJECT_ID ) rescue Gitlab::Error::NotFound logger.error "The runbook #{path} could not be found." end return unless runbook content = Base64.decode64(runbook.content) markdown(content, output) end private def markdown(str, io) io.puts TTY::Markdown.parse(str, symbols: :ascii) end end end end end