class Dirfy::CLI

Command-line interface

def self.start(argv = ARGV)

def self.start(argv = ARGV)
  options = {
    dry_run: false,
    verbose: false,
    indent: 4,
    prefix: ""
  }
  parser = OptionParser.new do |opts|
    opts.banner = "Usage: dirfy [options] [treefile]"
    opts.on("-d", "--dry-run", "Preview only; no files/dirs created") do
      options[:dry_run] = true
    end
    opts.on("-v", "--verbose", "Log each action") do
      options[:verbose] = true
    end
    opts.on("-iN", "--indent=N", Integer, "Spaces per level (default 4)") do |n|
      options[:indent] = n
    end
    opts.on("-pDIR", "--prefix=DIR", "Prepend DIR/ to every path") do |dir|
      options[:prefix] = dir.chomp("/") + "/"
    end
    opts.on("-h", "--help", "Show this help") do
      puts opts
      exit
    end
  end
  parser.parse!(argv)
  lines =
    if argv[0] && File.file?(argv[0])
      File.readlines(argv[0]).map(&:chomp)
    else
      STDIN.read.lines.map(&:chomp)
    end
  items = Parser.new(indent: options[:indent]).parse(lines)
  items.map! { |p| options[:prefix] + p }
  puts "🔍 Detected #{items.size} items to create."
  unless options[:dry_run]
    print "Proceed? (y/N) "
    answer = STDIN.gets.to_s.strip.downcase
    exit(1) unless %w[y yes].include?(answer)
  end
  IO.new(dry_run: options[:dry_run], verbose: options[:verbose]).create(items)
end