WEBVTT 00:00.000 --> 00:16.000 All right, we've got Alex, he's going to present cell the common expression language 00:16.000 --> 00:17.000 in Rust. 00:17.000 --> 00:24.000 All right, so please give him a warm welcome. 00:25.000 --> 00:28.000 I can't compare to clapping at the end and see how well I did. 00:28.000 --> 00:30.000 Thank you so much. 00:30.000 --> 00:31.000 So I'm Alex. 00:31.000 --> 00:35.000 I'm a Dith Feetler at Redout. 00:35.000 --> 00:39.000 And this project is not a Redout project, 00:39.000 --> 00:44.000 but yeah, I'm a maintainer on the cell Rust implementation. 00:44.000 --> 00:49.000 So here in the room, I guess you all rust developers. 00:49.000 --> 00:54.000 Like how many of those are doing Rust professionally, actually out of curiosity? 00:54.000 --> 00:56.000 Well, fair amount, that's great. 00:56.000 --> 01:01.000 So how many people know about cell already in this way the best hands? 01:01.000 --> 01:03.000 So that's good. 01:03.000 --> 01:06.000 All right, so what is cell? 01:06.000 --> 01:08.000 So it's a common expression language. 01:08.000 --> 01:15.000 It's a language that has a few interesting properties that may or may not fit your use case. 01:15.000 --> 01:19.000 So the ones out there probably else sound very, very good. 01:19.000 --> 01:22.000 So fast, portable, sustainable, and safe, 01:22.000 --> 01:26.000 are properties that probably we're all looking for. 01:26.000 --> 01:30.000 The language that's more properties, it's not turn completes. 01:30.000 --> 01:36.000 It has a cost model associated with an expression once it's being parsed. 01:36.000 --> 01:42.000 So that you can know how costly evaluate into expression is going to be. 01:42.000 --> 01:47.000 And yes, it avoids uses doing stupid stuff like looping forever, 01:47.000 --> 01:52.000 and things like that are just not possible in that language. 01:52.000 --> 01:55.000 So it came out of Google, I think around 2017, 01:55.000 --> 02:02.000 that's when the first open source repo commits happened. 02:02.000 --> 02:06.000 And they actually have three implementations like the go, 02:06.000 --> 02:09.000 the Java one and the C++ one, 02:09.000 --> 02:18.000 so that you can embed the parser interpreter in one of those languages. 02:18.000 --> 02:25.000 There is also JavaScript, typescript, and other stuff that exists, 02:25.000 --> 02:29.000 and they happens to be a rust implementation as well. 02:29.000 --> 02:33.000 Those are community efforts though, so they're not. 02:33.000 --> 02:36.000 And as far as I know, certainly for us, 02:36.000 --> 02:38.000 there is no relationship with Google. 02:38.000 --> 02:42.000 For others, as far as I can find, they're an online. 02:42.000 --> 02:50.000 So cell reaches some of the goals I mentioned before in different ways. 02:50.000 --> 02:54.000 Cell is a strongly typed expression language, 02:54.000 --> 02:57.000 which I personally like. 02:57.000 --> 03:00.000 I guess most people here do as well. 03:00.000 --> 03:04.000 You get a bunch of types out of the box. 03:05.000 --> 03:07.000 The ones you probably would expect, 03:07.000 --> 03:11.000 maybe somewhat surprising is maybe bytes in there. 03:11.000 --> 03:15.000 The timestamp duration ones are the ones that come from the, 03:15.000 --> 03:18.000 what Google calls the well known types, 03:18.000 --> 03:24.000 the protobuff stuff, supports maps, lists. 03:24.000 --> 03:28.000 It actually is more types like din types, 03:28.000 --> 03:33.000 so that when the type will only be known at evaluation time. 03:34.000 --> 03:41.000 Then support structs, mostly through the Google protobuff message stuff. 03:41.000 --> 03:46.000 It asks, what I call JSON interrupt, interrupt, 03:46.000 --> 03:49.000 because JSON is not natively supported. 03:49.000 --> 03:54.000 It is just a very well-specked how JSON is supposed to be transformed into a struct, 03:54.000 --> 03:56.000 and then you can leverage that. 03:56.000 --> 03:59.000 Because of all the types of these types of stuff again, right? 03:59.000 --> 04:01.000 That we care about. 04:01.000 --> 04:04.000 It has a spec like an actual language definition, 04:04.000 --> 04:06.000 and even the conformant tests, 04:06.000 --> 04:10.000 I'll get back to that later. 04:10.000 --> 04:13.000 All right, so let's look a little bit at what cell looks like. 04:13.000 --> 04:17.000 So I guess none of those need really any explanations. 04:17.000 --> 04:20.000 They're probably all fairly straightforward. 04:20.000 --> 04:23.000 We do string concatenation there. 04:23.000 --> 04:26.000 Resource of naming that case is supposed to be a string, 04:26.000 --> 04:30.000 and strings have some nice functions associated with them. 04:30.000 --> 04:33.000 We're looking to more details how that works later. 04:33.000 --> 04:37.000 So I guess none of that is too weird. 04:37.000 --> 04:40.000 Maybe the last one, the very last line, 04:40.000 --> 04:43.000 could be somewhat intriguing. 04:43.000 --> 04:49.000 So the all is actually a macro. 04:49.000 --> 04:53.000 And the first argument that you see there is actually 04:53.000 --> 04:57.000 defining a binding R for all the for every single element 04:57.000 --> 05:01.000 into the collection that we're looking on inside resources, right? 05:01.000 --> 05:04.000 So that maybe is somewhat surprising. 05:04.000 --> 05:08.000 But other than that, I think anybody can easily pick the language up 05:08.000 --> 05:12.000 and start writing sad expressions for whatever they're trying to achieve. 05:12.000 --> 05:19.000 I, wherever you embedded that run time inside your application. 05:19.000 --> 05:24.000 This weird like, yeah, I'll explain where it comes from and a bit. 05:24.000 --> 05:30.000 Another interesting syntax is the optional optional syntax 05:30.000 --> 05:37.000 in the sense that that needs to be enabled by your runtime and your browser. 05:37.000 --> 05:42.000 You don't need to necessarily support it and allow you to use it. 05:42.000 --> 05:45.000 So I changed them there. 05:45.000 --> 05:53.000 So that values we're looking at index thing 2 inside values. 05:53.000 --> 05:57.000 This could be a string if that would be a map key by string, for instance. 05:57.000 --> 05:59.000 In this case, it's in the right. 05:59.000 --> 06:02.000 And we're asking, oh, is that thing actually there? 06:02.000 --> 06:07.000 If it's not, that's going to return a option type, think of it. 06:07.000 --> 06:10.000 That then. 06:10.000 --> 06:13.000 So in this case, it's supposed to be a struct. 06:13.000 --> 06:15.000 If it's not there, it returns none. 06:15.000 --> 06:20.000 And eventually, I do something with this optional, right? 06:20.000 --> 06:24.000 So in this case, we're changing them. 06:24.000 --> 06:27.000 And at the end, I go, okay, if we couldn't resolve all this path, 06:27.000 --> 06:35.000 just return the value zero, this or value at the end. 06:35.000 --> 06:41.000 All right, so the big, like the way that I certainly was introduced to sell is 06:41.000 --> 06:45.000 because I work on a product that leaves in Kubernetes land and whatnot. 06:45.000 --> 06:50.000 And actually, sell is used in site Kubernetes for you to be able to do 06:50.000 --> 06:59.000 advanced validation on CRS that uses would want to apply to a cluster. 06:59.000 --> 07:05.000 And you would use expressions like predicate effectively to make sure that 07:05.000 --> 07:09.000 let's say you need a value to be between 12 and 13. 07:09.000 --> 07:11.000 Well, that's a shit number. 07:11.000 --> 07:13.000 12 and 42, right? 07:13.000 --> 07:16.000 And now you don't need to call it to a webbook. 07:16.000 --> 07:18.000 We can do that that way. 07:18.000 --> 07:22.000 That being said, sell is being used in very different context. 07:22.000 --> 07:26.000 Like, I think a library is using an accounting software for something. 07:26.000 --> 07:31.000 So it uses express sell to do something and then, I guess, 07:31.000 --> 07:33.000 numbers come out there. 07:33.000 --> 07:38.000 So we use it in site quadrant, which is the project I'm working on. 07:39.000 --> 07:47.000 Mostly to do predicates and data retrieval on payloads as the three examples you saw before. 07:47.000 --> 07:50.000 Most of that stuff is evaluated on the data plane. 07:50.000 --> 07:53.000 So I need to be really, really fast. 07:53.000 --> 07:57.000 Example given doing right limiting, making sure that this free question 07:57.000 --> 08:02.000 go through depending on certain predicates and or attributes. 08:02.000 --> 08:04.000 That needs to be fast. 08:04.000 --> 08:10.000 And we live inside a, let's say, interesting ecosystem nowadays. 08:10.000 --> 08:17.000 So I need to be able to run sell in the go context, in the rust context, 08:17.000 --> 08:22.000 and in the rust context, but running on wasm. 08:22.000 --> 08:25.000 All right, so getting started, that's probably very easy. 08:25.000 --> 08:29.000 You probably all seen that, so that's all you need to do. 08:29.000 --> 08:37.000 And this is how you would evaluate sell and like from a rust program. 08:37.000 --> 08:43.000 So we simply compiled the program. 08:43.000 --> 08:48.000 This could obviously fail, could it could not be valid sell. 08:48.000 --> 08:55.000 We didn't create a so-called context and then execute the program passing in that context. 08:55.000 --> 08:57.000 In this case, we're not doing anything with that. 08:57.000 --> 08:59.000 I'll show in a bit what happens. 08:59.000 --> 09:03.000 Again, it unwrap the result out there, because again, that could fail. 09:03.000 --> 09:07.000 And now we're making sure that the value is actually true. 09:07.000 --> 09:13.000 So the type of value is actually a sell value, and we provide all the, 09:13.000 --> 09:19.000 well, the typing should go coding to make sure that you can go from either direction back and forth. 09:19.000 --> 09:24.000 So that's the end to, at the end of the, the true there in case that wasn't clear. 09:24.000 --> 09:30.000 Right, so obviously comparing one to one is not very useful. 09:30.000 --> 09:34.000 So what you want to do is, so what you do is you use the context. 09:34.000 --> 09:39.000 I actually provide, I guess, context to this set expression being evaluated. 09:39.000 --> 09:44.000 So in this case, we're passing a variable in there with the claim variable, 09:44.000 --> 09:48.000 and we do it as the value 10, and now I can do math. 09:48.000 --> 09:56.000 And again, execute and full time series in the 20. 09:56.000 --> 10:02.000 You can also provide functions, the clear functions for your program to use. 10:02.000 --> 10:08.000 That's how you extend sell to do whatever may be appropriate for your domain. 10:08.000 --> 10:12.000 So that's one example of adding a function, just providing a closure, 10:12.000 --> 10:18.000 and it takes two arguments of, yeah, those are 64 back to the, 10:18.000 --> 10:20.000 to the sugar coding that we do. 10:20.000 --> 10:26.000 You don't need to care necessarily about the necessarily some case you will have, 10:26.000 --> 10:28.000 but let's say for those kind of types that's straightforward. 10:28.000 --> 10:32.000 So doing math, we can now do add 10, 10, 10, 10:32.000 --> 10:36.000 and we get a 20 out of the there, so that works too. 10:36.000 --> 10:40.000 So about that sugar coding, looking a little deeper how this works, 10:40.000 --> 10:44.000 how this works, I'm adding a function now, is empty. 10:44.000 --> 10:46.000 The function is declared where I'd be low. 10:46.000 --> 10:50.000 There is this weirdo thing, this is supposed to be an arc of a string, 10:50.000 --> 10:58.000 because yes, sell is, it's certainly thread safe. 10:58.000 --> 11:02.000 It's not really concurrent, but you can run on concurrent stuff. 11:02.000 --> 11:06.000 So if I don't need an expression one, share it with many threads. 11:06.000 --> 11:10.000 The same is actually somewhat through with the context, just as much, 11:10.000 --> 11:14.000 and then have that stuff being evaluated in different, 11:14.000 --> 11:18.000 share the cost threads and evaluating over multiple places. 11:18.000 --> 11:22.000 So that's adding a, is empty method on string, so add the function. 11:22.000 --> 11:26.000 So this weird thing that I just talked about now, I can have this, 11:26.000 --> 11:30.000 sell expression that just will, my string is empty, 11:30.000 --> 11:34.000 will be through a false depending on the string value of my string. 11:34.000 --> 11:38.000 So again, all that is was just a little bit more sugar coding, 11:38.000 --> 11:42.000 that's actually everything being gone. 11:42.000 --> 11:44.000 That's a function that always fails. 11:44.000 --> 11:48.000 So it actually takes a function context that has all the information 11:48.000 --> 11:50.000 that you really care about. 11:50.000 --> 11:54.000 That's a glance into that. 11:54.000 --> 11:59.000 And then you resolve, resolve, resolve to just resolve that, 11:59.000 --> 12:02.000 either contains a value or an executioner, 12:02.000 --> 12:05.000 and execute the thing you asked us to execute, 12:05.000 --> 12:10.000 which in this case would be the case, because that function always fails. 12:10.000 --> 12:18.000 All right, so back in 2024 is when I got involved with set rust. 12:18.000 --> 12:22.000 Again, I was just looking for cell support and rust. 12:22.000 --> 12:26.000 I found the scrape that was started. 12:26.000 --> 12:29.000 Around 20, 20 something. 12:29.000 --> 12:32.000 Then got somewhat a limbo for a time, 12:32.000 --> 12:36.000 then came out of the ash as yet again. 12:36.000 --> 12:38.000 And so I found a few bugs there, 12:38.000 --> 12:40.000 started submitting and whatever. 12:40.000 --> 12:44.000 And very friendly folks, all that went through. 12:44.000 --> 12:46.000 And then one day one weird bug came up, 12:46.000 --> 12:50.000 which was somewhat related to function dispatch code. 12:50.000 --> 12:54.000 That wasn't really working, asked to go implementation was working. 12:54.000 --> 12:58.000 And because we need those expressions to be able to 12:58.000 --> 13:02.000 be the same regardless of the environment that you're running, 13:02.000 --> 13:04.000 which I guess most people would want. 13:04.000 --> 13:08.000 I was like, okay, so what is going on there? 13:08.000 --> 13:10.000 I think that leads to the next thing. 13:10.000 --> 13:14.000 Yes, I guess I can fix that. 13:14.000 --> 13:17.000 So that was toward the end of 2024, I think. 13:17.000 --> 13:20.000 And looking into it, actually the bug was related 13:20.000 --> 13:24.000 that they use a different grammar than the other parsers. 13:24.000 --> 13:28.000 So I'm like, okay, well, we should be able to fix that. 13:28.000 --> 13:30.000 How hard can it be? 13:30.000 --> 13:34.000 When you're not really young anymore, but I'm still stupid. 13:34.000 --> 13:36.000 So as I go, okay, let's fix that. 13:36.000 --> 13:40.000 So the actual grammar is an envelope for grammar. 13:40.000 --> 13:42.000 That all the other implementation use. 13:42.000 --> 13:46.000 So I'm like, okay, well, just generate rust code 13:46.000 --> 13:48.000 from an after grammar, right? 13:48.000 --> 13:50.000 That's what Hitler does. 13:50.000 --> 13:52.000 Well, no, it doesn't. 13:52.000 --> 13:54.000 It doesn't do it for rust. 13:54.000 --> 13:56.000 So I found this antler rust rate. 13:56.000 --> 13:58.000 I'm like, okay, that's great. 13:58.000 --> 14:00.000 We'll just use that. 14:00.000 --> 14:04.000 So I ended up actually doing, I had to fork this library 14:04.000 --> 14:08.000 because the person who started it hasn't been active for 14:08.000 --> 14:10.000 three years. 14:10.000 --> 14:14.000 Actually, they come back somewhat last December for a few days 14:14.000 --> 14:18.000 and then redistipured. 14:18.000 --> 14:20.000 Anyways, I heard there's a war going on here. 14:20.000 --> 14:24.000 So anyways, I don't know what's going on, but always been luck. 14:24.000 --> 14:26.000 But so I ended up rewriting the entire parser, 14:26.000 --> 14:28.000 fixing this antler stuff. 14:28.000 --> 14:33.000 So we now have a different antler for rust rate 14:33.000 --> 14:35.000 that people can use. 14:35.000 --> 14:38.000 At the same time, we started running a fuzzer 14:38.000 --> 14:42.000 on our implementation and that way 14:42.000 --> 14:47.000 we found including bunch of bugs in the parser library 14:47.000 --> 14:50.000 and the rust parser library. 14:50.000 --> 14:55.000 So anyways, so you're like, why are you doing all this stuff? 14:55.000 --> 14:59.000 That doesn't sound like the same things to do. 14:59.000 --> 15:02.000 I probably could have fixed the grammar 15:02.000 --> 15:07.000 as I did initially in 2024, 15:07.000 --> 15:10.000 but actually spending more and more time 15:10.000 --> 15:13.000 in the other implementations, 15:13.000 --> 15:16.000 what cell is all about as those things, right? 15:16.000 --> 15:18.000 And other than extensibility, 15:18.000 --> 15:22.000 actually most of it is very much done at the ST level. 15:22.000 --> 15:27.000 So I have the abstract syntax tree level that results from the parsing. 15:27.000 --> 15:29.000 So I decided I want to align that 15:29.000 --> 15:34.000 and this actually more reasons why we want to align that. 15:34.000 --> 15:37.000 So the first one is fast. 15:37.000 --> 15:40.000 So we want things to be fast. 15:40.000 --> 15:46.000 And so that's shamelessly stolen from the Google website. 15:46.000 --> 15:49.000 The way that cell works, the idea is 15:49.000 --> 15:51.000 that you actually parse one, 15:51.000 --> 15:54.000 store the ST, share the ST across your infrastructure 15:54.000 --> 16:03.000 and then use that to evaluate your expression. 16:03.000 --> 16:06.000 So we want to be able to parse and go 16:06.000 --> 16:11.000 and then send it to Rust and wherever for evaluation. 16:11.000 --> 16:14.000 So yeah, that's the story I was just telling, right? 16:14.000 --> 16:16.000 So Antler has no target. 16:16.000 --> 16:20.000 Antler Rust existed, but abandoned and whatnot. 16:20.000 --> 16:21.000 So fix that. 16:21.000 --> 16:24.000 So again, if you care that exists now, 16:24.000 --> 16:27.000 I'll give many credits at the end of the stock on 16:27.000 --> 16:30.000 why that actually even exists. 16:30.000 --> 16:33.000 So with a conforming parser now, 16:33.000 --> 16:36.000 like the ST that it produces actually 16:36.000 --> 16:40.000 compliant with the ST that the other implementation 16:40.000 --> 16:43.000 produces, you're like, well, we must be good, right? 16:43.000 --> 16:46.000 So this Christmas, I had to excel. 16:46.000 --> 16:49.000 So what do you do? You write code. 16:49.000 --> 16:54.000 And I just decided to open up the interpreter 16:54.000 --> 17:00.000 to be completely, well, it's not entirely yet. 17:00.000 --> 17:03.000 Completely agnostic from the types you saw the beginning. 17:03.000 --> 17:06.000 I actually tell as internally a trade system, 17:06.000 --> 17:10.000 and it doesn't really care that your list is a list, first 17:10.000 --> 17:13.000 there, right? There is a list third trait that itself 17:13.000 --> 17:15.000 is composed of different traits. 17:15.000 --> 17:18.000 So people can actually provide different implementation 17:18.000 --> 17:21.000 of certain types, including the interpreter itself. 17:21.000 --> 17:24.000 When it's example given resolving the macro that you saw 17:24.000 --> 17:27.000 at the beginning, this all one that I used, 17:27.000 --> 17:32.000 there's one that, for instance, map a list of strings 17:32.000 --> 17:34.000 to a list of integers, for instance, right? 17:34.000 --> 17:38.000 I don't know on many of you know about run times, 17:38.000 --> 17:41.000 but it's quite a few tricks you can play 17:41.000 --> 17:43.000 if you can control the list that's being mapped 17:43.000 --> 17:45.000 in such a macro. 17:45.000 --> 17:48.000 So, again, seeing things just send up 17:48.000 --> 17:50.000 not as much as a large PRS, the other one, 17:50.000 --> 17:53.000 but so this refactoring that has no impact 17:53.000 --> 18:00.000 on any of the APIs that people have been using so far 18:00.000 --> 18:05.000 ended up in this PR, but it was a good Christmas break. 18:05.000 --> 18:08.000 So, but what am I doing, right? 18:08.000 --> 18:11.000 Why am I doing all those things? 18:11.000 --> 18:16.000 So, one issue that sells the Russ Center 18:16.000 --> 18:19.000 but currently has today is it doesn't really 18:19.000 --> 18:23.000 support what cell calls overloads. 18:23.000 --> 18:25.000 So, did I put some highlighting there? 18:25.000 --> 18:27.000 Yes, I did. Awesome. 18:27.000 --> 18:31.000 So, here what we're doing is we're writing a quick program 18:31.000 --> 18:36.000 that, and what we're trying to do is add a size function 18:36.000 --> 18:40.000 to support a size function, right? 18:40.000 --> 18:44.000 The problem that we have with this is that size 18:44.000 --> 18:48.000 exists on containers, right? 18:48.000 --> 18:51.000 So, on collections. In the case, here we're creating an array 18:51.000 --> 18:53.000 with one and two. 18:53.000 --> 18:58.000 A 64 in them, and that should return to, right? 18:58.000 --> 19:02.000 So, if you execute that, that's actually going to fail now 19:02.000 --> 19:05.000 because the right-hand side of the equal equal operator 19:05.000 --> 19:09.000 will say, well, I don't know how to solve that 19:09.000 --> 19:13.000 because your function expects a i64. 19:13.000 --> 19:16.000 So, what you did is you overload the size function 19:16.000 --> 19:21.000 that the default context comes with. 19:21.000 --> 19:27.000 And so, back again on this graph, if you pay attention, 19:27.000 --> 19:31.000 there is this yellow thing that says check. 19:31.000 --> 19:34.000 Check is a very interesting. 19:34.000 --> 19:38.000 It takes you ST in and applies many tricks on that 19:38.000 --> 19:41.000 ST, including ending up transforming it. 19:41.000 --> 19:44.000 Example given for making sure that those function exists. 19:44.000 --> 19:46.000 So, now I can make sure that when somebody 19:46.000 --> 19:49.000 calls size, that size function exists. 19:49.000 --> 19:53.000 One is being called on a proper types, two. 19:53.000 --> 19:57.000 Three, internally, you can do, you can avoid 19:57.000 --> 19:59.000 resolving the dynamic dispatch. 19:59.000 --> 20:01.000 You can now do it at check time. 20:01.000 --> 20:06.000 I know the left-hand side was the one on the array, right? 20:06.000 --> 20:09.000 So, we're coming in on the array, it's that function. 20:09.000 --> 20:12.000 It's the same name, but I don't need to do a 20:12.000 --> 20:15.000 more thick method called resolution, right? 20:15.000 --> 20:18.000 I can know what we're talking about and be very quick 20:18.000 --> 20:20.000 at evaluation time. 20:20.000 --> 20:24.000 So, the check phase is something that we don't have right now. 20:24.000 --> 20:27.000 And probably with the API that you saw, 20:27.000 --> 20:31.000 it's going to be somewhat awkward at the very least. 20:31.000 --> 20:34.000 You've right now solved it in a non-breaking way, right? 20:34.000 --> 20:38.000 All these other things I've done that have not changed 20:38.000 --> 20:42.000 any APIs, other than possibly the cell, 20:42.000 --> 20:47.000 but now the cell is being parsed correctly. 20:47.000 --> 20:50.000 Because what we're trying to do today, 20:50.000 --> 20:52.000 I did put some highlighting. 20:52.000 --> 20:54.000 So, again, what you saw before this program 20:54.000 --> 20:58.000 compile is just nice APIs, but so, what happens 20:58.000 --> 21:01.000 internally is you create a parser, you parse your thing, 21:01.000 --> 21:04.000 hopefully that worked out, you create a context. 21:04.000 --> 21:08.000 And so, before we were calling like resolve right away 21:08.000 --> 21:10.000 passing that context, right? 21:10.000 --> 21:13.000 The context actually can play sort of two concepts, 21:13.000 --> 21:18.000 like the dysfunction registry and the variables. 21:18.000 --> 21:20.000 And so, that's a bit of a problem. 21:20.000 --> 21:22.000 So, that could be one, like let's say check there 21:22.000 --> 21:24.000 as a magic function, wherever it lives. 21:24.000 --> 21:25.000 We don't care, right? 21:25.000 --> 21:27.000 That's all hypothetical, that doesn't exist. 21:27.000 --> 21:31.000 So, we will need to fix those things in a now 21:31.000 --> 21:32.000 breaking way. 21:32.000 --> 21:35.000 So, I was trying to get all that stuff done, 21:35.000 --> 21:37.000 what I called CDD. 21:37.000 --> 21:40.000 It's a conference-driven development. 21:40.000 --> 21:44.000 Yeah, it wouldn't necessarily recommend it 21:44.000 --> 21:46.000 as a whatever. 21:46.000 --> 21:49.000 So, I failed, I didn't get to get that done by yesterday. 21:49.000 --> 21:53.000 I was hoping to release the new thing here. 21:53.000 --> 21:54.000 But so, that didn't happen. 21:54.000 --> 21:56.000 So, that's the road ahead and where we are 21:56.000 --> 21:58.000 with cell rust, right? 21:58.000 --> 22:00.000 So, and by the way, and by the way. 22:00.000 --> 22:04.000 So, I'm wrapping up this overload problem. 22:04.000 --> 22:05.000 Introduce. 22:05.000 --> 22:07.000 Then we want to introduce the type checking, 22:07.000 --> 22:11.000 making sure that now we can sort of guarantee 22:11.000 --> 22:13.000 that nothing will ever go wrong. 22:13.000 --> 22:16.000 Start implementing all the perf stuff, 22:16.000 --> 22:20.000 which by the way has been going on already in parallel 22:20.000 --> 22:23.000 with my den, vowel, all the things. 22:23.000 --> 22:28.000 Some other contributor has been starting doing 22:28.000 --> 22:31.000 like performance-driven work, but because some of the 22:31.000 --> 22:34.000 endopinings have to change sort of put you in the 22:34.000 --> 22:36.000 weird position. 22:36.000 --> 22:40.000 And then eventually get to the protobuff and well-known 22:40.000 --> 22:44.000 types support a transparent support. 22:44.000 --> 22:46.000 So, that's effectively sugarcoding, right? 22:46.000 --> 22:49.000 Again, the API, so that you can pass in 22:49.000 --> 22:52.000 JRPC message that you get from somewhere 22:52.000 --> 22:55.000 and just inject it in the context and we figure everything 22:55.000 --> 22:56.000 out for you. 22:56.000 --> 22:58.000 So, that's all the fun stuff. 22:58.000 --> 23:00.000 If any of that sounds fun to you, 23:00.000 --> 23:02.000 I think you should come and talk to me. 23:02.000 --> 23:06.000 So, this is the legal disclaimer. 23:06.000 --> 23:11.000 None of what we have today would exist 23:11.000 --> 23:13.000 with a bunch of those people listed here, 23:13.000 --> 23:16.000 and I think they all deserve credits. 23:16.000 --> 23:20.000 So, a cleric is the person who invited me 23:20.000 --> 23:23.000 as a second maintainer on the project. 23:24.000 --> 23:28.000 Tom, I think as a person who started this many years ago, 23:28.000 --> 23:31.000 Adam is actually a colleague of mine who implemented the 23:31.000 --> 23:34.000 support, the optional support that you saw previously. 23:34.000 --> 23:37.000 John Howard, if you're an Istio user, 23:37.000 --> 23:40.000 you might know that person has been like 23:40.000 --> 23:44.000 awesome in terms of contributions and making sure 23:44.000 --> 23:46.000 that we become more performant. 23:46.000 --> 23:49.000 So, the antifore rust stuff has happened with 23:49.000 --> 23:52.000 the consenting base project. 23:52.000 --> 23:55.000 Ken has been teaching me so much about 23:55.000 --> 23:59.000 antler and parsers that I didn't know about, 23:59.000 --> 24:01.000 and now I know, I don't know if you're about that part, 24:01.000 --> 24:03.000 but at least we got it working 24:03.000 --> 24:06.000 without this help, I wouldn't have been able to 24:06.000 --> 24:09.000 fix the antifore rust crate. 24:09.000 --> 24:11.000 Yeah, and then especially thanks to a person who wrote this 24:11.000 --> 24:13.000 present term, I can run presentation. 24:13.000 --> 24:15.000 My terminal, I think that's pretty geeky. 24:15.000 --> 24:17.000 I think you should do it too, 24:17.000 --> 24:21.000 somebody else do it the four cell ops. 24:21.000 --> 24:22.000 So anyway, so that's that. 24:22.000 --> 24:25.000 If you want to know more, sell dash rust on 24:25.000 --> 24:29.000 GitHub, Quadron DiO's the project that I work on 24:29.000 --> 24:31.000 if you have any interested in that. 24:31.000 --> 24:33.000 So, thank you so much for listening to my nonsense 24:33.000 --> 24:35.000 and if there are any questions. 24:35.000 --> 24:38.000 Thank you.