Skip to content

Commit

Permalink
Finally got sfDict right.
Browse files Browse the repository at this point in the history
  • Loading branch information
bblfish committed Apr 13, 2021
1 parent c5163ed commit dd01e5f
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 6 deletions.
19 changes: 15 additions & 4 deletions src/main/scala/run/cosy/http/headers/Rfc8941.scala
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ object Rfc8941 {
//note: we have to go with parsing `=` first as parameters always returns an answer.
val dictMember: P[DictMember] = (key ~ (P.char('=') *> memberValue).eitherOr(parameters))
.map {
case (k, Left(parameters)) => DictMember(k, parameters)
case (k, Left(parameters)) => DictMember(k, PItem(true,parameters))
case (k, Right(parameterized)) => DictMember(k, parameterized)
}
val sfDictionary: P[SfDict] =
Expand Down Expand Up @@ -157,6 +157,17 @@ object Rfc8941 {
def canon: String =
o.items.map(i=>i.canon).mkString("("," ",")")+o.params.canon

given sfDictSer(using
Serialise[Item], Serialise[Param], Serialise[Params],
Serialise[PItem], Serialise[IList]
): Serialise[SfDict] with
extension (o: SfDict)
def canon: String = o.map{
case (tk, PItem(true,params)) => tk.canon+params.canon
case (tk, pit: PItem) => tk.canon+"="+pit.canon
case (tk, lst: IList) => tk.canon+"="+lst.canon
}.mkString(", ")

}
//
//types uses by parser above
Expand All @@ -174,11 +185,11 @@ object Rfc8941 {
type Param = (Token, Item)
type Params = ListMap[Token, Item]
type SfList = List[Paramed]
type SfDict = ListMap[Token, Paramed|Params]
type SfDict = ListMap[Token, Paramed]

def Param(tk: String, i: Item): Param = (Token(tk),i)
def Params(ps: Param*): Params = ListMap(ps*)
def SfDict(entries: (Token,Paramed|Params)*) = ListMap(entries*)
def SfDict(entries: (Token,Paramed)*) = ListMap(entries*)
/**
* dict-member = member-key ( parameters / ( "=" member-value ))
* member-value = sf-item / inner-list
Expand All @@ -187,7 +198,7 @@ object Rfc8941 {
* @param values if InnerList with an empty list, then we have "parameters", else we have an inner list
*/
final
case class DictMember(key: Token, values: Paramed|Params)
case class DictMember(key: Token, values: Paramed)

/** Parameterized Item */
final
Expand Down
13 changes: 11 additions & 2 deletions src/test/scala/run/cosy/http/headers/Rfc8941_Test.scala
Original file line number Diff line number Diff line change
Expand Up @@ -187,8 +187,8 @@ class Rfc8941_Test extends munit.FunSuite {
sfDictionary.parse("""a=?0, b, c; foo=bar"""),
R(SfDict(
Token("a") -> PI(false),
Token("b") -> ListMap(),
Token("c") -> ListMap(Token("foo")->Token("bar"))
Token("b") -> PI(true)(),
Token("c") -> PI(true)(Token("foo") ->Token("bar"))
)))
assertEquals(
sfDictionary.parse("""a=(1 2), b=3, c=4;aa=bb, d=(5 6);valid"""),
Expand Down Expand Up @@ -286,6 +286,7 @@ class Rfc8941_Test extends munit.FunSuite {
""":cafebabe:;enc="utf8""""
)
}

test("serialisation of List") {
import scala.language.implicitConversions
//example from
Expand All @@ -308,5 +309,13 @@ class Rfc8941_Test extends munit.FunSuite {
| alg="rsa-pss-sha512";created=1402170695;expires=1402170995""".rfc8792single
)
}

test("serialisation of sfDict") {
import scala.language.implicitConversions
assertEquals(
SfDict(Token("key")->PItem(true)(Param("encoding",Token("utf8")))).canon,
"key;encoding=utf8"
)
}

}

0 comments on commit dd01e5f

Please sign in to comment.