Activity Graph

Page 1 of 3 | Next »


[15:40:19] ankhers: vaer-k: I'm still using alchemist right now. I have been meaning to move to using lsp though. I just haven't made the time to do it.
[15:58:55] ankhers: vaer-k: Might be of some help setting Emacs up for Elixir.


[18:26:03] ankhers: I had this issue previously, but I do not remember the solution. When running mix hex.publish, I am getting an undefined function error for ExDoc.Config.default_formatter/0. I am currently using Elixir 1.8 and ex_doc version 0.18.1.
[20:24:22] ankhers: If you are okay with bringing in a library, timex accepts a parsing format. So you can parse any date format you want.
[20:30:00] ankhers: <<day :: binary-size(2), month :: binary-size(2), year :: binary-size(4)>> = "DDMMYYYY"
[20:31:27] ankhers: Oh, you wanted DDMMYY, just change the last binary-size to 2.
[20:31:31] ankhers: serafeim: ^^
[20:32:50] ankhers: Then you can just use Date.from_erl({"20" <> year, month, day}).
[20:34:17] ankhers: That would be nice. josevalim, would you be okay with that kind of bot in here?
[20:37:22] ankhers: Fair enough.
[20:38:46] ankhers: Then there would just be random people doing ,doc DateTime.to_erl/2 or something.
[20:40:44] ankhers: `h Date.to_erl' in iex.
[20:51:45] ankhers: josevalim: What was the solution to the undefined function ExDoc.Config.default_formatter/0 issue again? I can't seem to remember what I did to fix it.
[20:55:49] ankhers: Nevermind. I think I got it.
[20:57:46] ankhers: rawtaz: I think if we just did the same thing as iex would be easiest. Simply `h Date.to_erl'
[20:58:25] ankhers: Which would spit back
[20:59:17] ankhers: Maybe we could `h app Module.function' to search that module.
[20:59:28] ankhers: Rather, search that app.
[21:00:09] ankhers: Up to José though.


[22:10:11] ankhers: absolutejam3: I think it depends. Are all three of those live_renders unique to that one page? If so, I would probably throw it all together into a single one. However, if you need that functionality across multiple pages, I would keep it separate.
[22:12:53] ankhers: Actually, instead of unique to that page, I should ask if they are always used together.


[13:00:38] ankhers: Quit: ZNC 1.7.2 -
[13:01:25] ankhers: has joined #elixir-lang


[02:32:56] ankhers: wormwood: The same function definition, or the same function name?
[02:34:33] ankhers: Put it in another module. Then all of your current modules can call the function from that one.
[02:40:40] ankhers: wormwood: Maybe not a new module, but one that makes sense for all of your others to be calling from.
[13:46:02] ankhers: nickjj: I commented on your gist for how I would have written it. Not sure if you will consider it to be better or not.
[13:50:24] ankhers: This is generally my preferred approach to conditionals, i.e., making a function for them.
[13:53:38] ankhers: When it makes sense to, I start my pipes with a value. I think the only exception to that would be a 0-artity function.


[13:06:34] ankhers: nickjj: I haven't tested, but I would assume you could use Application.get_env/3 within your config files. It is just Elixir code afterall. However, I would advise against trying to get too complex in your config scripts.
[13:08:11] ankhers: Can you show some example code?
[13:29:35] ankhers: Okay. So the config function will not put the value into the application env immediately. It does put it in the process dictionary though. So what you may want to do is retrieve that value by using `Process.get({Mix.Config, :config})[:my_app]'. This will give you the entire configuration for that application. However, this seems like it is getting into private API territory.
[13:30:48] ankhers: nickjj: ^^
[16:34:03] ankhers: nickjj: Do you mean the foo_view.ex files?
[16:35:22] ankhers: I generally put them in the view files themselves.
[16:35:59] ankhers: Unless it is common to multiple views, then I create a new module for them.
[16:36:24] ankhers: Unless you need the stuff the `use' brings along with it, don't do it.
[16:38:03] ankhers: You can always create another entry in your hello_web.ex file for view_helper or something that only brings in what you need.
[16:39:57] ankhers: Though, to be honest, I am not really sure what the most idiomatic thing to do is.
[18:38:23] ankhers: I'm used to it from the nixos forums.
[18:58:38] ankhers: The sponsors section at the bottom of a thread does not seem to be working.


[19:12:19] ankhers: I asked the other day but I think I missed someones response. Is there a suggested way to add timestamps to a table after the initial migration in ecto?
[19:25:41] ankhers: nickjj: Thanks.
[19:25:56] ankhers: OvermindDL1: The problem is there are already fields in there and it violates the not null contraint.


[23:50:58] ankhers: Is there a suggested way of adding timestamp fields to a table after initial table creation?


[14:53:09] ankhers: I enjoyed and
[14:54:32] ankhers: Yeah, I'm not sure how effecting the Phoenix book would be without at least understanding the basics of Elixir.
[14:55:22] ankhers: At least the Elixir one. Maybe their mentor can help with the Phoenix stuff.
[14:55:35] ankhers: But the project in the Phoenix book is really cool.


[21:57:23] ankhers: hypercore: define best? I think Disqus is easy to setup and use.
[21:59:07] ankhers: hypercore: What are your requirements?
[22:02:50] ankhers: hypercore: Anonymous comments? Or only from users that are logged in?
[22:04:51] ankhers: Okay. Then at the very least, you will need one table with id, user_id, assoc_id, parent_id and comment. Where assoc_id is the id of the thing you are commenting on.
[22:10:30] ankhers: I don't use facebook or youtube, so I don't really know what you mean by that.
[23:50:22] ankhers: hypercore: Sorry for the delay. I guess it really depends. I would probably just build the notification system into postgres, especially if you are not currently using anything else. Mainly because I have more experience with pg than anything else.
[23:54:21] ankhers: It depends on my requirements. If my application is mostly static, I would just query the database for new notifications on page reload. However, if it is very dynamic, I would probably use something that isn't pg.
[23:54:24] ankhers: rawtaz: ^^
[23:55:57] ankhers: At least for the notification part. I might still hold the actual comments in pg.
[23:56:15] ankhers: But Phoenix also makes it easy enough via channels to send notifications when things happen.
[23:56:19] ankhers: So who knows.


[16:31:06] ankhers: lanodan: I'm not very familiar with Gentoo, but does that take into consideration different config files? Elixir libraries can act differently based on configuration passed in.


[15:48:18] ankhers: What was the reason for moving the migration stuf to ecto_sql instead of keeping it in ecto?


[15:33:25] ankhers: The socket has a :private key with what looks like assigns from my conn. Is there some public API to retrieve those values? Or is it safe to access the :private key?
[15:38:50] ankhers: They are not in assigns.
[15:39:24] ankhers: The user that is logged in so that I can verify they are allowed to do the thing they are trying to do.
[15:41:09] ankhers: Sorry. I started with that, then changed my question...
[15:41:27] ankhers: Yes, but I don't really have access to the user without accessing the :private key.
[15:42:00] ankhers: So I just want to make sure that it is safe to do so, or if there is something I do not know about.
[15:43:12] ankhers: No. I rolled my own because nothing was really big when I started on this project. But I am using a live route, which does not hit a controller, so I do not have access to the conn before I get the socket.
[15:45:12] ankhers: But like I said, all of my conns assigns are under the :private key of the socket. I'm assuming it is relatively safe to access that?
[15:48:01] ankhers: Yeah, I just thought that was unecessary complication and indirection with something relatively simple.
[15:48:48] ankhers: It isn't in the view though. It is in the socket side of things, which I see more equivalent to the controller.
[15:50:45] ankhers: Also, I do have a plug that ensures they are logged in, but not one to ensure they are only accessing resources they should be.
[15:53:34] ankhers: Hence the "more equivalent" part.
[15:53:43] ankhers: It is far from a view
[15:56:57] ankhers: I don't think the entire conn needs to be accessible. But having a safe way to access my assigns would be nice.
[15:58:01] ankhers: But they are already there in the :private key. So it is doing something.
[15:59:15] ankhers: Sure, but if I needed to continue using them, I could just throw them in the sockets assigns.
[15:59:21] ankhers: So first render is fine, really.
[15:59:52] ankhers: So is it safe to access that then?
[16:00:13] ankhers: socket.private.assign_new.my_thing.
[16:03:25] ankhers: "When a LiveView is mounted in a disconnected state, the Plug.Conn assigns will be available for reference via `assign_new/3`, allowing assigns to be shared for the initial HTTP request." -- It sounds like I should have access to them.
[16:06:58] ankhers: I guess I will just use a controller for this. Still seems unnecessarily complex and indirect to me.


[00:33:19] ankhers: SingingBoyo: There is also rest_for_one. Which may be a better fit for when some children know about eachother. You could also just name the children, assuming there is only one of each.
[12:54:26] ankhers: celyr: When you prefix a variable with an underscore, it just tells the compiler that you are not going to use it, so it will not give a warning about unused variables. So if you plan to use it, remove the leading underscore.
[14:16:20] ankhers: Has anyone ever used an eex file for HTML and NOT included the html part of the file name? i.e., foo.eex instead of foo.html.eex?
[15:04:46] ankhers: I think there are 3 or 4 of those going on now, aren't there?


[06:16:07] ankhers: *.net *.split
[21:58:35] ankhers: Trying to publish a new version of a lib, getting an error when building docs. "module MyModule was not compiled with flag --docs", any ideas? I don't believe anything was changed there.
[22:23:28] ankhers: josevalim: 1.8.1 right now.
[22:26:05] ankhers: josevalim: Just updated ex_doc, now I'm getting an error about ExDoc.Config.default/1 is undefined when running mix hex.publish.
[22:26:24] ankhers: It installed 0.20.2 when updating.
[22:27:15] ankhers: That is really unfortunate.
[22:29:19] ankhers: Thanks for the help there. If I come across that issue again, I will try and look deeper into it.


[00:07:06] ankhers: adonis: Todo.Cache.start_link(nil) still gets called. That format is known as MFA or Module, Function, Arguments. The list is used for arguments so that you can pass a variable number of arguments to a given function. If we did not use the list, you would have to use some other format (maybe a loarger tuple?) But then there could possibly be limitations on the number of arguments you could pass to the function.
[00:08:06] ankhers: For what it's worth, since you are passing nil, you could just not pass anything (i.e., use an empty list for that third argument).
[00:08:25] ankhers: Unless nil is somehow important to the initialization function?
[00:11:41] ankhers: Yes, again, we use lists so that we can technically pass an infinite amount of values to a given function. So if you did {Todo.Cache, :start_link, [:foo, :bar]}, it would pass two arguments, :foo as the first and :bar as the second, to the start_link function.
[00:12:42] ankhers: {Todo.Cache, :start_link, [[:foo, :bar]]} would call start_link([:foo, :bar])
[00:12:54] ankhers: It takes a bit to get used to.
[00:13:07] ankhers: I know I stumbled on this more than a few times when starting.
[00:14:13] ankhers: start_link(:foo, :bar)
[00:14:31] ankhers: Each element in the list becomes an argument to the function.
[00:14:46] ankhers: -- If it makes a difference, this is what is being called underneath.
[00:16:03] ankhers: You are welcome! Glad I could help. If there is anything else you come across that is confusing, just ask.
[13:27:37] ankhers: Specifically, I use
[13:27:59] ankhers: I have a small server setup that I use for various things and I threw ZNC on that.
[13:28:36] ankhers: I think some web based IRC clients will also act as a bouncer for you.
[13:33:08] ankhers: Just be careful with that though. Your passwords are stored in plaintext with ZNC. So make sure it is something you trust.
[13:33:57] ankhers: someone you trust rather.


[00:31:32] ankhers: jnoon2: Glad you got it working!


[00:41:21] ankhers: jnoon2: What type of work is being done in the "work loop"? Is any "work" being done on the Elixir side? Or does it start the process, wait for it to end, then do something with that?
[00:45:16] ankhers: When does the "work loop" start? Is it a message from the client? Randomly? Immediate on join?
[01:03:26] ankhers: jnoon2: Are these channel topics all unique, or do they share a topic?
[01:07:01] ankhers: Okay. I would probably create a new module that can be your gen server. I don't really like using spawn_link directly unless I have to. Then you can pass `self()' as an argument to the spawn_link call so that the new gen server has access to the channel process.
[01:08:33] ankhers: Then this would need a bit of testing, but I think channel processes are just gen servers, so you may be able to use GenServer.cast(pid, {message, result}) from the new genserver where `pid'` is the channel process pid. If that doesn't work, Just use send.
[01:11:13] ankhers: Also, when you do SomeModule.start_link(self()), you can store that pid in your socket.assigns so you can reference it when necessary.
[01:19:34] ankhers: Cool. Good luck! Feel free to ping me if you get stuck with anything.
[17:53:02] ankhers: Map.get(my_struct, :key). Replace :key with your variable.
[17:53:11] ankhers: Structs are just named maps.
[18:15:38] ankhers: What is your reason for using apply_action/2? Ecto generally just does the right thing there.
[18:57:40] ankhers: laut: I have not read it myself.
[18:58:05] ankhers: paulo1993: I think if you remove the apply_action/2 call, things should work for you.
[19:19:53] ankhers: paulo1993: Then what is it you are trying to accomplish?
[19:21:33] ankhers: apply_action/2 does not actually do the insert/update/etc. You will need to actually call `MyApp.Repo.insert(changeset)
[19:24:04] ankhers: paulo1993: When you say "create a struct", presumably you mean you also want it in the database?
[19:38:21] ankhers: Oh okay. Try removing the call to apply_action in the embedded Card.changeset function.
[19:39:23] ankhers: I believe you will still want to return a changeset from that function. Then when you use the apply_action/2 in the People.changeset function, it should do the right thing.


[00:01:20] ankhers: newer or make modifications to. But yet.
[00:01:34] ankhers: yes, rather.
[00:02:58] ankhers: Someone else can speak to the effectiveness of EEx.eval_string vs compiled templates. But it may also be possible to compile the templates somehow. I would just need to look into it.
[00:03:44] ankhers: Yeah. It should be possible. Like I said, I would just need to look into it.
[00:04:40] ankhers: I need to go for a bit. I will be back in 30-60 minutes if you still want some help.
[17:20:41] ankhers: hypercore: re: security with eex in database. This is one of the reasons I originally suggested something like mustache.
[17:30:40] ankhers: Either way works.
[18:09:22] ankhers: hypercore: Not problem.


[00:59:33] ankhers: I have a nested has_many form using inputs_for. I am using cast_assoc to cast the child data. When I use Repo.insert on my parent type, I'm getting a failure to insert because the children to not have the parent_id field on it. What is the way you are supposed to handle this type of thing?
[01:00:49] ankhers: jnoon2: How are you attempting to build your release? Are you sure you are not currently in the dev environment?
[01:06:13] ankhers: I have zero experience with windows and Erlang/Elixir. Sorry. That looks like it should work though.
[01:06:13] ankhers: I have zero experience with windows and Erlang/Elixir. Sorry. That looks like it should work though.
[01:06:40] ankhers: Sorry about that double post. I don't know what I did :(
[16:39:30] ankhers: Miyu-saki: [{:foo, :bar}, {:baz, :quux}] == [foo: :bar, baz: :quux]. It is literally the same thing. I believe the reason the tuple version is more used is because there is no sugar for using a 3 element tuple. And we can use the third element in the tuple to define special options. Like {:distillery, "~> 1.5", runtime: false} or {:phoenix_live_reload, "~> 1.0", only: :dev}, etc.
[19:22:13] ankhers: With ex_aws_ses, is there currently a way to add an attachment?
[22:41:39] ankhers: What are you trying to do?
[22:57:29] ankhers: And presumably you would want to be able to dynamically add more product types?
[22:58:24] ankhers: What happens to the current products if I update an existing template?
[23:00:20] ankhers: But updated with what information?
[23:04:09] ankhers: Yeah, I was thinking the templates could be defined in a table. Then you could either embed, or have a "regular" relation for the actual properties.
[23:06:21] ankhers: Single table for all the templates.
[23:07:28] ankhers: Are you using postgres?
[23:07:50] ankhers: id | name:text | properties:json (or jsonb)
[23:08:08] ankhers: Plus whatever additional data you need to keep with it.
[23:08:42] ankhers: The properties could look like { "battery size": "string", "foo": "number" }
[23:09:38] ankhers: With the "value" being the input type being displayed on screen.
[23:16:10] ankhers: I wouldn't look at the template when rendering. I would just render the data that is associated. Maybe you can send an email or any other notification to the users says the template was updated with new fields. Then they can go and edit their product(s) to match the new fields.
[23:16:44] ankhers: Unless there is some acceptable default, you can't really magically update everything.
[23:17:50] ankhers: Like what?
[23:18:05] ankhers: If you have an example, I may be able to help.
[23:22:18] ankhers: If you want an actually .eex file, that stops being dynamic and you may as well hardcode things. If you want to stay dynamic, look into whether anyone has built a runtime templating engine. Then let me know, because I need one soon for a project.
[23:22:50] ankhers: I mean, you could still use eex, but I'm not sure how that rates compared to other things.
[23:24:07] ankhers: Maybe mustache or something? I think that is meant to be relatively simple for end users.
[23:24:18] ankhers: I guess it depends on who is creating these templates.
[23:25:22] ankhers: Oh, in that case, by all means, you can use the eex format and just call the eex engine to display them. Though, I would still make this part of the template creation. That way you can just change it on the fly without needing to redeploy your application.
[23:25:42] ankhers: But, that is a design choice you can make.
[23:28:03] ankhers: The easiest, especially if you are using a template engine that has logic (like eex), is you can just do `if @product[:some_field] then ... else ...'.
[23:28:49] ankhers: Either that or make the templates immutable, at least the properties, and always create new ones.
[23:33:28] ankhers: Sounds right.
[23:42:41] ankhers: it's own json with the key:value pairs so it knows how to actually render the product.
[23:42:41] ankhers: No. Your "product_templates" table would be id:int | product_name:string | template_ver:int | properties:json | layout:string. Like I said earlier, your properties would look like { "battery_size": "string", "foo": "number" }. This would inform your form which inputs to generate. The layout would be your eex file that tells how to actually render the thing. Your products table would have a reference to the template field, as well as
[23:43:16] ankhers: Don't save the rendered HTML. Mostly because you want to have the ability to make changes if necessary.
[23:43:20] ankhers: At least, I wouldn't.
[23:45:00] ankhers: Yes. Do not store the HTML. You just want to store the eex template in the database.
[23:45:30] ankhers: This way you can make changes to the template as needed.
[23:46:31] ankhers: Because then you would need to redeploy your application whenever you add a new product.
[23:46:56] ankhers: Which if you are doing that, you may as well just hardcode the different products into your application and make things easier.
[23:48:03] ankhers: Have a map or something that describes the different products that you allow.
[23:48:48] ankhers: But why make something mostly dynamic, just to make the templates be hard coded?
[23:50:58] ankhers: I guess just different ways of thinking. You aren't wrong if you want to do it that way. I would just probably save my eex template to the database.
[23:51:24] ankhers: But now you need to manage whether or not they can see the templates.
[23:53:06] ankhers: I would need to look up how eex works. I haven't worked with it directly.
[23:54:48] ankhers: Yeah, that.
[23:54:54] ankhers: I was trying to find a link to that.
[23:57:30] ankhers: EEx.eval_string(@product.template.layout, properties: You need a keyword list for the second argument. You also want to look at the products properties, not the templates properties.


[19:27:00] ankhers: Does anyone have experience with live view and select elements? For whatever reason mine doesn't seem to be sending the value of the dropdown to the server. Everything else seems fine.
[19:29:18] ankhers: Nevermind. I had a typo in my nested form.


[00:41:36] ankhers: ariedler: ?


[20:41:30] ankhers: Is there a suggested way to use inputs_for within a liveview template?
[22:24:46] ankhers: heimann: I'm going to ask a really dumb question, and I'm sorry for that. But, are you 100% sure postgres things it is a jsonb field and not a string field that is holding JSON data?
[22:25:52] ankhers: Okay. Is it storing a JSON string?
[22:29:44] ankhers: In psql, what happens if you `select data->'Key' from table;'?
[23:15:57] ankhers: heimann: Sorry, had to go for a minute. I think that is the case as well.


[21:32:18] ankhers: mariotomo: Are you looking for something for Elixir, or something for Phoenix (the framework that would be most similar to django)?
[21:33:44] ankhers: jnoon2: Is there a reason you are defining it like that? Why not just ["deps.get", "ecto.drop", "ecto.create", "ecto.migrate", "schema", "cmd --app subapp mix run priv/repo/seeds.ex"]? Does that make any difference?


[14:34:53] ankhers: nickjj: Just pass the custom variable through the assigns?
[14:37:11] ankhers: I may be misunderstanding, but in your template you can do `render("foo.html", key_1: value_1, key_2: value_2)'
[14:38:52] ankhers: The assigns is just a Keyword list. And since it is just a list, you can concatonate or anything else.
[14:39:29] ankhers: render("foo.html", Keyword.put(assigns, :f, f))
[14:39:55] ankhers: Remember, it is just Elixir code. You can do whatever you wanted.
[14:40:58] ankhers: Can you show the stack trace?
[14:42:28] ankhers: That isn't the stack trace though.
[14:44:18] ankhers: I need to know the type of `assigns' in your case in order to figure out what is going on.
[14:45:50] ankhers: Yes, but if you are getting an error saying no function clause, it isn't a Keyword list. So I need to know the type of it in order to tell you how to add a new key to it.
[14:47:36] ankhers: It is a map apparently. So use Map.put(assigns, :f, f) instead.
[14:52:27] ankhers: I hate to do this, but... It works on my machine. Maybe clean and rebuild the project?
[14:53:55] ankhers: I modified one of my current renders like `= render "_employees.html", Map.put(@conn.assigns, :f, "foo")' and then put `= @f' in my _employees.html.haml file.
[14:56:23] ankhers: That still worked.
[15:05:21] ankhers: I think I would need to see more code in order to help here. If you want to throw up a project on GH or something, I could take a look at it.
[15:14:22] ankhers: Do you need all of assigns in the discount template? Because you could just do `render(HelloWeb.CheckoutView, "_discount.html", f: f)'
[15:45:00] ankhers: Phoenix sets a default layout.
[15:46:23] ankhers: I'm really not sure what is happening without being able to play around with the project. Sorry.
[21:52:00] ankhers: Yeah, I'm having trouble reaching it at the moment


[00:30:14] ankhers: rawtaz: I don't think that is allowed in any of the languages I know.
[00:31:12] ankhers: That isn't a tuple (at least not last time I used PHP)
[00:31:28] ankhers: my_map[:foo] works.
[00:33:50] ankhers: I think it could be done. [] just calls on the access behaviour.
[00:33:55] ankhers: Have a good one.


[14:26:42] ankhers: I have a struct I am trying to make an assertion on. One of this fields has a string field. I am currently just doing `assert %MyStruct{foo: "some field"} = reply'. This field has a "long" in it. I want to check that number against the one that I have to make sure they match up. What are my options here? I know I can just put the :foo field in a variable and do another assertion, but is that the best way?
[14:28:37] ankhers: It has a format, but yes. "some text: $number not found" -- basically that.
[14:29:25] ankhers: Should be.
[14:31:04] ankhers: The number isn't really a static length though. It can be any long value, ranging from min to max.
[14:33:58] ankhers: illegal pattern compile error.
[14:38:27] ankhers: Thanks for the help.
[14:54:31] ankhers: jkva: I do for my own work. dialyzer isn't a perfect replacement for a type system, but it helps.
[14:59:17] ankhers: Nicd-: <<"some text: ", foo :: binary - size(size), " rest" >>, I have to convert the number I currently have into a string, and use `byte_size/1' to get the number of bytes though. I'm hoping there is a better way of doing this.
[15:08:04] ankhers: gazler: If I do that, I may as well just do `%{foo: message}; assert ^message = "some text: #{my_num} rest"'.
[15:08:32] ankhers: %{foo: message} = reply
[15:08:35] ankhers: That rather.
[15:11:53] ankhers: Right. Thank you. I don't know why that didn't cross my mind.
[15:26:44] ankhers: How can I use a variable in a regex?
[15:27:21] ankhers: Turns out there are different messages based on the version of mongo being used. So I'm just going to match that the number is there.
[15:32:01] ankhers: benwilson512: Thanks. Did I miss that somewhere in the documentation? If not, I will throw up a PR for that soon.
[17:28:31] ankhers: For Phoenix Channels, is there some way to make a plug that runs BEFORE each handle_in callback?
[17:30:30] ankhers: Fair enough. Do you know if that is possible still? Run some function before the handle_in callback?
[17:31:35] ankhers: Yeah. I was just wondering if there was a different way.


[17:16:11] ankhers: edwinbalani: If you require certain keys, why not make a struct?
[17:17:13] ankhers: Then in the documentation for your struct, you can say that keys a, b and c are required, while x, y and z are optional.
[17:25:26] ankhers: Or if you want to not make a struct, you can just say in the documentation that the function(s) they accepted keys in the map or keyword list.
[17:25:51] ankhers: Wow, I englished really bad there.
[17:26:10] ankhers: You can just say in the documentation of the function which keys are accepted and how they interact.
[17:28:03] ankhers: Basically it comes down to a documentation thing, and not really a typespec thing. You can still create a type around a map though if it helps.


[14:06:45] ankhers: No problem!