Skip to content

Commit

Permalink
Improve labelled parser
Browse files Browse the repository at this point in the history
  • Loading branch information
mattroberts297 committed Apr 13, 2017
1 parent 6f430f2 commit 39ddc2d
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 18 deletions.
8 changes: 6 additions & 2 deletions .travis.yml
@@ -1,7 +1,10 @@
language: scala

scala:
- 2.11.8
- 2.12.1

jdk:
- oraclejdk8

before_install:
- openssl aes-256-cbc -pass pass:$PGP_PASSPHRASE -in secret.asc.enc -out local.secret.asc -d
Expand All @@ -11,7 +14,7 @@ script:
- sbt clean coverage test coverageReport

after_success:
- bash <(curl -s https://codecov.io/bash)
- sbt coveralls

deploy:
skip_cleanup: true
Expand All @@ -24,3 +27,4 @@ env:
global:
- secure: "gSADu/D+fuUIG6rIwn4r/BdI6UYKyfISjfc4J71K3UH0jwsYnKbI/xeuEsi5tYnHSf2cb+0mrsovqMguK8ARAlTyDIGkcBnSs6bXk+3pfH0OjP/Kh8U31hjQMT5WkqGfZBkrOloc7gJSzhMwmVkaOPb2lKZ0ku0Uw/hFpMKq6nXD17iwCvd5BV1SaT/lUaGq7cgxDRpYB2tVvVrS5kk9dU7+D7ASo8Wx/SyYl8PEcK5d4JjwcF815GuHBeSPBjzTrQsowqvN2nN4IWaojRqVAC6cnZv4atPFabFQWFvAZ7sgYhHrUARRTs7bWaTARxNhHmfx/fbHh2Oz6kE6y5NMz/YJa1W6edPTeGqDkT2XS7wDDGhVVrt5IPAjs/F3pGVr4jYd5xTDg+6C2SSC0rrdfW8XoZ7mAastv1lZQaW8iu1P3aqMes97g/QOwN5KVTbuWhA/VhHJALCPjFUB+v8l84EzT36gHAyJO1eHXhwbltyeuvyaiwJB8/sC9YbZWCZd6ACeh6qO9CEdzQygNcBFkCXJTBWch/ZqmcAHxmVk2Wooe3cUxVJWKC7cdnAZ3+nkJFthbjIcGmXhV8x3o0M/z09MysbcduTXxpmiU2vvpEP4GqxTMQIkDzpJivO4kDltSR6bOdfIgJAg6JyJ0tALCc9hvZBcHKSE9liT+aZF/WM="
- secure: "TR8jSl6tv2LhV9wwB7JAj7ubbMKv1dxtY/R95Bjs4o3NfX735pX4hienbU21NUcxMwNdGgb36ZtfKQbdNE4s0olV2ZvWN8ZtoiJ1mhhIAL2FKn+crR8lLILfmDN17u5G4NrXE0z2mc25Zw2hW1Xv6q6A8MqL+NM2MCOA/45kXnxYpRzhVM4/VKqLYoCCRNrEAPeTNJzIFcd1w3/TvKDw2UQ+bJV22H90wQbli1N9j5t5k4eUQmmOlYXw2d8YPum1yHr6+BgB63MRwU13DHAbLvtxQ3HOzhCBKNP+NV6V9aHMmvc5iNkpnTtf9zxQAF7QocYZMbdex2k7ZW0X5QhoJeqmRILP9UcL4GF1lRQUTqFxuREH2f+dQ7EUkg7E0SNLcOlkLgy21gvqu7L9xpGmDGwhmRWqpEKbTGeJxBm9lTx7B+zDV1K50FA2lEomO5ozZWlg0yzd038QTv34q3xIvHx+wvLQu9oXbTWcdrp9WJyy0wAjJDNxDXTl5xoEb4pTlUAC3q0FCMl+ifpnAgf2nIVb/hIxFiRgyp46LrVTs9rVmOg8YqHhA6ZhKjS83xlmbK/UUTz0FHAboPW9+YTlaJnhaLy6n1YUgGTByi33Jqev1jCy8seLqkjFwvzzdQCRNKWmt+5wzgoT8oNXwW+FCNhgaBzoAjqJ7LfF+/xZhI8="
- secure: "yKmnFu4D1adONxUZDSxT4+C4YVNnkjwoDx0KPYGh6NllzB4nwLGF80IyloSCEw1xx8UlM1KBaTDoHrVsCm1DRKxJCJOeCRDyqWPzlytweNmyIymV8+gaAtKJxb/B/N0wkyfbAB4ZOcWY5lyAyqtDwMPvvw9yuzTIAr+hAH9o5Fq23caSCMabsiXFgANZq91fejnQe70muMq++6MmkosGooV4H84nVdGD+DU4fsAm8t1KiDjaEg1V3PuTzvdgfKDGBwdCugvWm5KFR5Vuh0WhmIrVBpP7dj7Vg7+td2I2cie7FyXJhne5f5Fb4XjlIYyiUSRuwN6phiS+p1fbRbwF/04BK9KVM+AuH3QNzE2zHX8qEPLxg7B7KPKVoygX4bPyoo51T1w3P/fm1V4yIt4GZP2lTcIp0bYOrSGwk20+enlHncXMaN4VjK0DsNmp+WNI8JXu2QznQ2T7XhJqYP9wmkuysp0CXNfm3JDfTWeWWhmFUCwREAbyJbHliqJmIRruO0ZnIWfG4GmlO6LPNDiu7pTd847+BJASWVai9/URDoKwjfSOt1loAdO2RiJUp5plHkuJzFdyQS7m4SmNpTtkiFaR4Wa6BrvD0pE9DnLpgQkcJERRddqBQeCxA7n3o/VuU28a8VQ3pwtWo9cHcwKT0/F2nh/nYTKojOx4x/GvlWI="
2 changes: 1 addition & 1 deletion README.md
@@ -1,7 +1,7 @@
# CLAPer

[![Build status](https://travis-ci.org/mattroberts297/claper.svg?branch=master)](https://travis-ci.org/mattroberts297/claper)
[![Coverage status](https://codecov.io/gh/mattroberts297/claper/branch/master/graph/badge.svg)](https://codecov.io/gh/mattroberts297/claper)
[![Coverage status](https://coveralls.io/repos/github/mattroberts297/claper/badge.svg?branch=master)](https://coveralls.io/github/mattroberts297/claper?branch=master)

A Command Line Argument Parser without the boiler plate.

Expand Down
4 changes: 2 additions & 2 deletions build.sbt
Expand Up @@ -2,7 +2,7 @@ lazy val root = (project in file(".")).settings(
name := "claper",
organization := "io.mattroberts",
version := "0.1.0",
scalaVersion := "2.11.8",
scalaVersion := "2.12.1",
scalacOptions := Seq("-deprecation", "-feature", "-unchecked"),
libraryDependencies ++= Seq(
"com.chuusai" %% "shapeless" % "2.3.2",
Expand Down Expand Up @@ -37,7 +37,7 @@ lazy val root = (project in file(".")).settings(
_: sbt.MavenRepository => false
},

licenses := Seq("MIT" -> url("https://github.com/mattroberts297/claper/LICENSE")),
licenses := Seq("MIT" -> url("https://github.com/mattroberts297/claper/blob/master/LICENSE")),
homepage := Some(url("https://github.com/mattroberts297/claper")),
scmInfo := Some(
ScmInfo(
Expand Down
4 changes: 3 additions & 1 deletion project/plugins.sbt
@@ -1,4 +1,6 @@
addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.3.5")
addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.5.0")

addSbtPlugin("org.scoverage" % "sbt-coveralls" % "1.1.0")

addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "1.1")

Expand Down
41 changes: 30 additions & 11 deletions src/main/scala/io/mattroberts/LabelledParser.scala
Expand Up @@ -14,16 +14,37 @@ object LabelledParser {
}
}

implicit val stringParser: LabelledParser[String] = {
create(args => args.head)
implicit def stringParser[K <: Symbol](
implicit
witness: Witness.Aux[K]
): LabelledParser[FieldType[K, String]] = {
val name = witness.value.name
create { args =>
val arg = args.dropWhile(a => a != s"--$name").tail.head
field[K](arg)
}
}

implicit val intParser: LabelledParser[Int] = {
create(args => args.head.toInt)
implicit def intParser[K <: Symbol](
implicit
witness: Witness.Aux[K]
): LabelledParser[FieldType[K, Int]] = {
val name = witness.value.name
create { args =>
val arg = args.dropWhile(a => a != s"--$name").tail.head.toInt
field[K](arg)
}
}

implicit val boolParser: LabelledParser[Boolean] = {
create(args => args.head.toBoolean)
implicit def booleanParser[K <: Symbol](
implicit
witness: Witness.Aux[K]
): LabelledParser[FieldType[K, Boolean]] = {
val name = witness.value.name
create { args =>
val arg = args.find(a => a == s"--$name").isDefined
field[K](arg)
}
}

implicit val hnilParser: LabelledParser[HNil] = {
Expand All @@ -33,15 +54,13 @@ object LabelledParser {
implicit def hlistLabelledParser[K <: Symbol, H, T <: HList](
implicit
witness: Witness.Aux[K],
hParser: Lazy[LabelledParser[H]],
hParser: Lazy[LabelledParser[FieldType[K, H]]],
tParser: LabelledParser[T]
): LabelledParser[FieldType[K, H] :: T] = {
create { args =>
val name = witness.value.name
val hs = args.dropWhile(a => a != s"--$name")
val hv = hParser.value.parse(hs.tail)
val hv = hParser.value.parse(args)
val tv = tParser.parse(args)
field[K](hv) :: tv
hv :: tv
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/test/scala/io/mattroberts/LabelledParserSpec.scala
Expand Up @@ -4,7 +4,7 @@ import org.scalatest.{MustMatchers, FlatSpec}

class LabelledParserSpec extends FlatSpec with MustMatchers {
"A LabelledParser" must "parse SimpleArguments" in {
val args = List("--alpha", "a", "--beta", "1", "--charlie", "true")
val args = List("--alpha", "a", "--beta", "1", "--charlie")
val parsed = LabelledParser[SimpleArguments].parse(args)
parsed must be (SimpleArguments("a", 1, true))
}
Expand Down

0 comments on commit 39ddc2d

Please sign in to comment.