diff options
author | Jakob Odersky <jodersky@gmail.com> | 2015-03-21 20:07:22 +0100 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2015-03-21 20:12:15 +0100 |
commit | dac8f076338ad121ce482993b226f945304969dc (patch) | |
tree | 4f6b071ff1e64603e7b1d27d6706de67b32cfbe9 /mavlink-library | |
parent | f7a74ef1050cb390bf3929d6e7bc07631d015f06 (diff) | |
download | sbt-mavlink-dac8f076338ad121ce482993b226f945304969dc.tar.gz sbt-mavlink-dac8f076338ad121ce482993b226f945304969dc.tar.bz2 sbt-mavlink-dac8f076338ad121ce482993b226f945304969dc.zip |
several changesv0.2
* warn on enum entries with no value
* reporting integrated with sbt
* add uint8_t_mavlink_version to types
Diffstat (limited to 'mavlink-library')
3 files changed, 35 insertions, 7 deletions
diff --git a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Parser.scala b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Parser.scala index e2dda42..ca1b772 100644 --- a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Parser.scala +++ b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Parser.scala @@ -2,7 +2,11 @@ package com.github.jodersky.mavlink import scala.language.postfixOps +import scala.xml.Attribute +import scala.xml.Elem import scala.xml.Node +import scala.xml.Null +import scala.xml.Text import scala.util.Try import trees._ @@ -11,10 +15,8 @@ import trees._ * Provides means to parse a MAVLink dialect definition into a * scala object representation. */ -object Parser { - - def fatal(error: String, node: Node) = throw new ParseError("Parse error at " + node + ": " + error) - def warn(warning: String, node: Node) = Console.err.println("Warning " + node + ": " + warning) +class Parser(reporter: Reporter) { + import reporter._ def parseDialect(node: Node): Dialect = parse(node) match { case p: Dialect => p @@ -42,8 +44,17 @@ object Parser { case <enum>{_*}</enum> => val name = (node \ "@name").map(_.text).headOption getOrElse fatal("no name defined for enum", node) - val entries = (node \ "entry").toSet map { n: Node => - parse(n) match { + val entries = (node \ "entry").zipWithIndex map { case (n, i) => + + //FIXME: some official MAVLink dialects don't define values in enums + val nodeWithValue = if ((n \ "@value").isEmpty) { + warn("no value defined for enum entry, using index instead", n) + n.asInstanceOf[Elem] % Attribute(None, "value", Text(i.toString), Null) + } else { + n + } + + parse(nodeWithValue) match { case e: EnumEntry => e case _ => fatal("illegal definition in enum, only entries are allowed", n) } @@ -92,6 +103,7 @@ object Parser { val ArrayPattern = """(.*)\[(\d+)\]""".r def parseType(typeStr: String, node: Node): Type = typeStr match { case "int8_t" => IntType(1, true) + case "uint8_t_mavlink_version" => IntType(1, false) case "int16_t" => IntType(2, true) case "int32_t" => IntType(4, true) case "int64_t" => IntType(8, true) diff --git a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Reporter.scala b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Reporter.scala new file mode 100644 index 0000000..629c3a8 --- /dev/null +++ b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Reporter.scala @@ -0,0 +1,16 @@ +package com.github.jodersky.mavlink + +import scala.xml.Node + +trait Reporter { + + protected def printWarning(msg: String): Unit + + def fatal(error: String, node: Node) = throw new ParseError("Parse error: " + error + " at " + node) + def warn(warning: String, node: Node) = printWarning("Warning: " + warning +" at " + node) + +} + +object StandardReporter extends Reporter { + protected def printWarning(msg: String): Unit = Console.err.println(msg) +}
\ No newline at end of file diff --git a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/trees/package.scala b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/trees/package.scala index fc4b5f3..75c1753 100644 --- a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/trees/package.scala +++ b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/trees/package.scala @@ -5,7 +5,7 @@ package trees { sealed trait Tree case class Dialect(version: String, enums: Set[Enum], messages: Set[Message]) extends Tree - case class Enum(name: String, entries: Set[EnumEntry]) extends Tree + case class Enum(name: String, entries: Seq[EnumEntry]) extends Tree case class EnumEntry(value: Int, name: String, description: String) extends Tree case class Field(tpe: Type, nativeType: String, name: String, enum: Option[String], description: String) extends Tree case class Message(id: Byte, name: String, description: String, fields: Seq[Field]) extends Tree { |