aboutsummaryrefslogblamecommitdiff
path: root/main.scala
blob: 6d4879d58c8517bfde47dd24f80d94959963782a (plain) (tree)

































































































































































































































































                                                                                     
package codenames

object Names {

  val adverbs = Array(
    "abundantly",
    "across",
    "amiss",
    "approximately",
    "awful",
    "awry",
    "basic",
    "beforehand",
    "earnestly",
    "even",
    "extra",
    "flat",
    "forthwile",
    "greatly",
    "henceforth",
    "hereinafter",
    "hitherto",
    "imminent",
    "infra",
    "inter",
    "low",
    "master",
    "nearby",
    "neither",
    "never",
    "nigh",
    "nonethless",
    "not",
    "otherwise",
    "overall",
    "quick",
    "real",
    "soon",
    "then",
    "thereafter",
    "throughout",
    "too",
    "upright",
    "very"
  )

  val adjectives = Array(
    "absurd",
    "adjacent",
    "astral",
    "axial",
    "azure",
    "blinking",
    "catchy",
    "closed",
    "complex",
    "dark",
    "extreme",
    "fabulous",
    "false",
    "ferocious",
    "flashy",
    "forbidden",
    "furious",
    "glacial",
    "grand",
    "great",
    "hidden",
    "high",
    "imaginary",
    "inherent",
    "intrinsic",
    "jumpy",
    "light",
    "little",
    "low",
    "mellow",
    "nodal",
    "open",
    "optimistic",
    "optuse",
    "patchy",
    "penurious",
    "perplex",
    "pickled",
    "polar",
    "private",
    "rare",
    "sentient",
    "serene",
    "sigmoid",
    "specific",
    "stable",
    "steep",
    "top",
    "true",
    "ubiquitous",
    "unbalanced",
    "united",
    "universal",
    "vast",
    "vindictive",
    "voodoo",
    "whitty",
    "wide",
    "wimpy",
    "windy",
    "xenial",
    "xenolithic",
    "yay",
    "zillion",
    "zoic"
  )

  val nouns = Array(
    "aleph",
    "azimuth",
    "bet",
    "bingo",
    "cat",
    "catch",
    "cigar",
    "clone",
    "clown",
    "condor",
    "conjugate",
    "cow",
    "crow",
    "dark",
    "delta",
    "eagle",
    "echo",
    "edition",
    "emu",
    "five",
    "flume",
    "fountain",
    "graphite",
    "gazelle",
    "high",
    "index",
    "jack",
    "jar",
    "jiffy",
    "joke",
    "khi",
    "king",
    "kite",
    "light",
    "lima",
    "loop",
    "low",
    "macro",
    "module",
    "mutton",
    "nest",
    "nil",
    "nomenclature",
    "omicron",
    "one",
    "open",
    "ostrich",
    "parcel",
    "phi",
    "pin",
    "psi",
    "pyrite",
    "quartz",
    "queen",
    "quill",
    "resource",
    "rho",
    "rick",
    "route",
    "rules",
    "sentinel",
    "set",
    "sheep",
    "sigma",
    "six",
    "slam",
    "smoke",
    "source",
    "spinel",
    "thunder",
    "top",
    "topaz",
    "tulip",
    "umbrella",
    "unit",
    "user",
    "vow",
    "wolf",
    "xenium",
    "yaw",
    "yield",
    "zenith",
    "zero",
    "zulu"
  )

}

object Main extends App {

  val help =
    """|Usage: codename [OPTIONS...] [SPECIFICATION...]
       |Generate a random codename according to a specification ("A a n" by default).
       |
       |Options:
       |
       |  -h, --help        show help message
       |  -v, --version     show version information
       |
       |Specification:
       |
       | SPEC ::= { 'A' | 'a' | 'n' | SEP }
       | SEP  ::= char
       |
       |where an 'A' is replaced by a random adverb, an 'a' by an adjective and
       |an 'n' by a noun.
       |
       |For example, the specification "A-a-n" will produce a code name such as:
       |"extra-pickled-umbrella"
       |
       |Multiple specifications may be given, each of which will be printed on a
       |separate line.""".stripMargin

  val (options, arguments) = args.partition(_.startsWith("-"))

  options foreach {
    case "-h" | "--help" =>
      println(help)
      sys.exit(0)
    case "-v" | "--version" =>
      println(BuildInfo.version)
      sys.exit(0)
    case x =>
      System.err.println(s"Invalid option '${x}'.")
      sys.exit(1)
  }

  val withDefault = if (arguments.isEmpty) Array("A a n") else arguments

  def printNext(words: Array[String]) =
    print(words(util.Random.nextInt(words.length)))

  withDefault foreach { arg =>
    arg foreach {
      case 'A'   => printNext(Names.adverbs)
      case 'a'   => printNext(Names.adjectives)
      case 'n'   => printNext(Names.nouns)
      case other => print(other)
    }
    println("")
  }

}