https://kotlinlang.org logo
#getting-started
Title
# getting-started
d

Daniele B

05/12/2021, 7:24 AM
Is there any way by which, having a
List<String>
like this:
Copy code
val myList = listOf("paramA","paramB","paramC")
I can enforce an API like this?
Copy code
fun myFunc (paramA: String, paramB: String, paramC: String)
basically a function, which has those strings as names for String arguments?
v

Vitaliy Zarubin

05/12/2021, 7:30 AM
?
d

Daniele B

05/12/2021, 7:41 AM
@Vitaliy Zarubin thanks, that’s nice However I was looking for something slightly different. So, I would like to make available a function which has exactly those parameters. So that a library user is able to type “`myFunc()`” and the IDE shows the arguments to provide to such function. So basically a standard function, with those argument names. Not sure if the power of Kotlin allows this.
e

ephemient

05/12/2021, 7:49 AM
how is that function coming into existence? if you're doing code generation, just generate it with the right parameter names?
v

Vitaliy Zarubin

05/12/2021, 7:50 AM
Look towards reflection
d

derek

05/12/2021, 7:50 AM
Copy code
fun hello(nameA: String, nameB: String, nameC: String): Unit = TODO()

fun main() {
    val parmsName = ::hello.parameters.map{
        it.name
    }
    println(parmsName)
}
d

Daniele B

05/12/2021, 7:54 AM
@ephemient so, basically I would like a library user to define those parameters as a List<String>, and based on that I would like to automatically provide the library user with a function with such signature. But not sure if it's possible.
@derek thanks, but
parameters
shows as “unresolved”
d

derek

05/12/2021, 8:08 AM
You should add kotlin reflect lib in your gradle project.
d

Daniele B

05/12/2021, 8:14 AM
@derek I still cannot see it. Maybe it’s because I am on Multiplatform
e

ephemient

05/12/2021, 8:34 AM
so. there's no cross-platform options for reflection and runtime code generation at this level. but even on JVM, I'm not sure how you imagine this could possibly work.
Copy code
val names = listOf(...)
val function = makeFunction(names)
even with something like that,
function
has to have a type when it's declared, you can't change that at runtime
d

Daniele B

05/12/2021, 8:39 AM
@ephemient yes, it makes sense. I will try to investigate other ways to achieve a similar solution, using Enum or Sealed Class. Thanks!
j

Joost Klitsie

05/12/2021, 9:02 AM
@Daniele B what do you wish to achieve with this? Why do you want to generate a function from a list, and what is that function in term supposed to do?
d

Daniele B

05/12/2021, 9:12 AM
@Joost Klitsie I need to define an ID with this String format:
"param1=value1&param2=value2&param3=value3"
Where the number and the names of the params should be defined by the library user. e.g. this could be all possibile IDs:
Copy code
"country=Belgium"

"listType=ALL&filter=name"

"id=203"
So, I want to give the chance to the library user to hardcode the parameter names, and then being able to populate each of them with a simple function. This ID should be univocally identified as the String format I mentioned above: “param1=value1&param2=value2&param3=value3”
j

Joost Klitsie

05/12/2021, 9:18 AM
That sounds to me like you would want to generate code, of which I am not sure how it looks like on kotlin multiplatform
because that makes me think you should create a compiler plugin
which looks rather cool but sadly also rather complicated 🙂
d

Daniele B

05/12/2021, 9:20 AM
yes, I thought so
v

Vitaliy Zarubin

05/12/2021, 9:26 AM
I think you're complicating something
j

Joost Klitsie

05/12/2021, 9:35 AM
I would definitely pass in a map or a list of pairs @Vitaliy Zarubin if I'd go that way :) just like in ktor
d

Daniele B

05/12/2021, 9:36 AM
@Vitaliy Zarubin this assumes the parameters are specified as free text: “param1=value1&param2=value2&param3=value3” but this could be very error prone ideally, the library should help by providing a solid structure to specify the parameters
also a Map doesn’t provide a great structure, but I guess it’s still easier than writing a compiler plugin
j

Joost Klitsie

05/12/2021, 9:40 AM
I would choose a map or vararg pair over writing a compiler plugin :)
d

Daniele B

05/12/2021, 9:40 AM
yes, I think so too
v

Vitaliy Zarubin

05/12/2021, 9:41 AM
r

Roukanken

05/12/2021, 9:43 AM
if they are some kind of wierd IDs... why are they not some data structure?
eg, map, or maybe some fancy delegation trick with map
d

Daniele B

05/12/2021, 9:47 AM
The problem with defining a data structure such as a data class, is that I don’t know how to convert “`param1=value1&param2=value2&param3=value3`” back to the data class. But with Map of course it’s easy.
r

Roukanken

05/12/2021, 9:49 AM
if your only problem is getting data to/from string, then you could for example write custom format for #serialization
d

Daniele B

05/12/2021, 9:49 AM
yes, that could actually be an option
I have never done, but is it possible to convert
param1=value1&param2=value2&param3=value3
to
MyDataClass(param1 = value1, param2 = value2, param3 = value3)
and back with Serialization?
considering that the data class is always different
r

Roukanken

05/12/2021, 9:56 AM
as long as you know what class is stored in the string, yes for sure - that's basically JSON format just different separators and stuff, so custom format would be able to handle it if you don't, and don't mind changing the string a bit, (eg,
type=MyDataClass&param1=value1&param2=value2&param3=value3
) then it should be possible too I haven't looked into custom formats too deep yet tho... Here is some reading for it: https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/formats.md
d

Daniele B

05/12/2021, 9:58 AM
@Roukanken thanks! it sounds like a great direction!
@Roukanken wow, thanks again! it solved my use case perfectly, much better than using the function I was thinking about!
2 Views