twirl icon indicating copy to clipboard operation
twirl copied to clipboard

no type arguments for views?

Open benmccann opened this issue 10 years ago • 14 comments

@refried originally filed as https://github.com/playframework/playframework/issues/2194. migrating it here

views/foo1.scala.txt (won't compile)

@[L<:shapeless.Nat:shapeless.ops.nat.ToInt](bar: Bar[L])

@bar has size @shapeless.Nat.toInt[L]

views/foo2.scala.txt (will compile, but silly!)

@(bar: Bar[_<:shapeless.Nat], size: Int)

@bar has size @size

controllers/Application.scala

package controllers

import play.api._
import play.api.mvc._
import shapeless.Nat
import shapeless.ops.nat.ToInt

class Bar[L<:Nat]

object Application extends Controller {

  def index = Action {
    Ok(views.html.index("Your new application is ready."))
  }

  // won't compile
  def foo1 = views.txt.foo1(new Bar[Nat._3])

  // needlessly complicated
  def foo2 = {
    def barSize[L<:Nat:ToInt](bar: Bar[L]): Int = Nat.toInt[L]
    val bar = new Bar[Nat._3]
    val size = barSize(bar)
    views.txt.foo2(bar, size)
  }
}

benmccann avatar Jul 31 '14 14:07 benmccann

+1

jaliss avatar Jan 24 '15 16:01 jaliss

+1, indeed.

mhzajac avatar Mar 14 '15 01:03 mhzajac

+1

ghost avatar Mar 27 '15 13:03 ghost

+1

dante4d avatar Mar 28 '15 11:03 dante4d

+1

1tchy avatar Apr 13 '15 21:04 1tchy

+1

motns avatar Jun 11 '15 01:06 motns

+1

joepjoosten avatar Apr 06 '16 07:04 joepjoosten

Hi, FWIW, a workaround is to use the string interpolator:

import play.twirl.api.StringInterpolation

def foo[L <: Nat : ToInt](bar: Bar[L]): Html =
  html"$bar has size ${Nat.toInt[L]}"

julienrf avatar Apr 06 '16 08:04 julienrf

Aha, thanks @julienrf, that’s good to know.

aryairani avatar Apr 07 '16 03:04 aryairani

big +1

intracer avatar Aug 03 '16 20:08 intracer

+1

perryrosenberg avatar Oct 19 '16 17:10 perryrosenberg

+1

aryairani avatar Aug 02 '17 14:08 aryairani

I'd like to replace DomainId with a type argument; otherwise I'm going to have to duplicate this code all over the place.

@(domains: List[(DomainId, String)])(implicit QPE: QueryParamEncoder[Option[DomainId]])

<select name="domain">
    <option value="@{QPE.encode(None).value}">--- ALL DOMAINS ---</option>
    @for(pair <- domains) {
        <option value="@{QPE.encode(Some(pair._1)).value}">@pair._2</option>
    }
</select>

aryairani avatar Aug 02 '17 14:08 aryairani

Related #153

mkurz avatar Nov 10 '18 00:11 mkurz