# frozen_string_literal: true # A Ruby re-creation of /rdb, the relational database tools Mark Williams # Company sold for COHERENT (~1991). require 'open3' require 'date' require 'tmpdir' require 'fileutils' module Rdb ROOT = File.expand_path('..', __dir__) NUM = /\A\s*[+-]?(\d+\.?\d*|\.\d+)\s*\z/ Command = Struct.new(:name, :desc, :syntax, :block) COMMANDS = {} class << self def die(msg) abort "#{File.basename($PROGRAM_NAME)}: #{msg}" end # register 'name', 'description', 'syntax' do |args| ... end def register(name, desc, syntax = nil, &block) COMMANDS[name] = Command.new(name, desc, syntax || name, block) end def alias_for(name, target) cmd = COMMANDS.fetch(target) COMMANDS[name] = Command.new(name, cmd.desc, cmd.syntax.sub(target, name), cmd.block) end def run(name, args) cmd = COMMANDS[name] or die("unknown command '#{name}'") Env.new(name).instance_exec(args.dup, &cmd.block) end end end require_relative 'rdb/table' require_relative 'rdb/env' Dir[File.join(__dir__, 'rdb/cmd/*.rb')].sort.each { |f| require f }