<div dir="ltr"><div>Hi everyone, <br></div><div><br></div><div>I've been  doing a little work on the Rust API implementation and I have some  minimal examples up and running. <br></div><div><br></div><div>You can take a look at how the API is shaping up here: <a href="https://mxxo.github.io/rgmsh/rgmsh/index.html">https://mxxo.github.io/rgmsh/rgmsh/index.html</a></div><div>There are some more in-depth examples here: <a href="https://mxxo.github.io/rgmsh/rgmsh/model/index.html">https://mxxo.github.io/rgmsh/rgmsh/model/index.html</a></div><div><br></div><div>It is still very work-in-progress :) <br></div><div><br></div><div>There are some differences compared to the  current API, based on some issues I run into a lot. <br></div><div><br></div><div>1. I have a lot of trouble keeping tags straight. <br></div><div>A lot of my bugs come from mismatching tags (e.g. using View tags where Field tags are required, etc.) <br></div><div><br></div><div>I am trying to make the tags a little more explicit by giving them all types. <br></div><div><br></div><div>That way, you can see what kind of tags a function expects, <br></div><div>and how to get that kind of tag (e.g. add_point returns a PointTag, etc.)</div><div><br></div><div><pre class="gmail-rust gmail-rust-example-rendered"><span class="gmail-comment">// make a point</span>
<span class="gmail-kw">let</span> <span class="gmail-ident">p1</span>: <span class="gmail-ident">PointTag</span> <span class="gmail-op">=</span> <span class="gmail-ident">geom</span>.<span class="gmail-ident">add_point</span>(<span class="gmail-number">0.</span>, <span class="gmail-number">0.</span>, <span class="gmail-number">0.</span>)<span class="gmail-question-mark">?</span>;
<span class="gmail-comment">// and another</span>
<span class="gmail-kw">let</span> <span class="gmail-ident">p2</span>: <span class="gmail-ident">PointTag</span> <span class="gmail-op">=</span> <span class="gmail-ident">geom</span>.<span class="gmail-ident">add_point</span>(<span class="gmail-number">1.</span>, <span class="gmail-number">1.</span>, <span class="gmail-number">0.</span>)<span class="gmail-question-mark">?</span>;

<span class="gmail-comment">// create a line from the two points</span>
<span class="gmail-kw">let</span> <span class="gmail-ident">l1</span>: <span class="gmail-ident">CurveTag</span> <span class="gmail-op">=</span> <span class="gmail-ident">geom</span>.<span class="gmail-ident">add_line</span>(<span class="gmail-ident">p1</span>, <span class="gmail-ident">p2</span>)<span class="gmail-question-mark">?</span>;</pre></div><div><pre class="gmail-rust gmail-rust-example-rendered gmail-compile_fail"><span class="gmail-comment"><font face="arial,sans-serif"><br>Done properly, this catches more of my dumb errors at compile time, <br>because functions that take tags won't compile given the wrong kind of input.  </font><br></span></pre><pre class="gmail-rust gmail-rust-example-rendered gmail-compile_fail"><span class="gmail-comment"><br>// try to make a line from two raw integers</span>
<span class="gmail-kw">let</span> <span class="gmail-ident">l1</span> <span class="gmail-op">=</span> geom.add_line(<span class="gmail-number">1</span>, <span class="gmail-number">2</span>); <span class="gmail-comment">// won't compile</span></pre></div><div><br></div><div>2. For some functions with lots of parameters, I usually have <br></div><div>to have the documentation open to understand what the function is doing. <br></div><div><br></div><div>I want to try experimenting with making these longer functions more explicit. <br></div><div><br></div><div>For example, to add a torus in the C++ API, you could use: <br></div><div><span style="font-family:monospace"><br></span></div><div><span style="font-family:monospace"><span class="gmail-kw">gmsh::model::occ::addTorus(1, 1, 1, 3, 0.2);</span></span></div><br><div>and you could probably guess what each parameter means. <br></div><div>It's also nice and quick to write :)</div><div><br></div><div>Here is one alternative implementation idea: <br></div><div><pre class="gmail-rust gmail-rust-example-rendered"><span class="gmail-kw">let</span> <span class="gmail-ident">centroid</span> <span class="gmail-op">=</span> <span class="gmail-ident">Point</span> { <span class="gmail-ident">x</span>: <span class="gmail-number">1.0</span>, <span class="gmail-ident">y</span>: <span class="gmail-number">1.0</span>, <span class="gmail-ident">z</span>: <span class="gmail-number">1.0</span> };
<span class="gmail-kw">let</span> <span class="gmail-ident">torus</span> <span class="gmail-op">=</span> <span class="gmail-ident">geom</span>.<span class="gmail-ident">add_torus</span>(
    <span class="gmail-ident">Torus</span> {
      <span class="gmail-ident">centroid</span>,
      <span class="gmail-ident">main_radius</span>: <span class="gmail-number">3.0</span>,
      <span class="gmail-ident">pipe_radius</span>: <span class="gmail-number">0.2</span>
    })<span class="gmail-question-mark">?</span>;</pre></div><div><br></div><div>It's more verbose, but arguably clearer to someone else reading your code (and hopefully easier to debug if the result wasn't as expected etc). <br></div><div>When I make API calls, I usually try and document what each parameter was, and this style reduces the burden on me to explain what I'm doing. <br></div><div><br></div><div>I hope to allow both styles so that people used to "quick and dirty" calls don't have to change unless they want to. <br></div><div><br></div><div>Thank you very much for your time. <br></div><div>Max <br></div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Jul 27, 2019 at 2:30 PM Christophe Geuzaine <<a href="mailto:cgeuzaine@uliege.be">cgeuzaine@uliege.be</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Hi Max,<br>
<br>
Sounds cool - we've never used Rust... The simplest is indeed probably to just wrap our official C bindings.<br>
<br>
Christophe<br>
<br>
> On 26 Jul 2019, at 21:59, Max Orok <<a href="mailto:morok@mevex.com" target="_blank">morok@mevex.com</a>> wrote:<br>
> <br>
> Hello everyone, <br>
> <br>
> I was thinking about a set of Rust bindings for the Gmsh C API (v4.4) and made a very raw set using the bindgen tool:  <br>
> <a href="https://github.com/mxxo/gmsh-sys" rel="noreferrer" target="_blank">https://github.com/mxxo/gmsh-sys</a><br>
> <br>
> For a more idiomatic Rust API, I'll be following the re-implementation of the C++ API in C (gmsh.h_cwrap) as a guide. <br>
> <br>
> The naming for Rust's package manager is first come first serve (and undeleteable), so I thought I'd see if there were any objections to registering a "gmsh-sys" low-level C binding crate and a "gmsh" idiomatic Rust API crate.<br>
> <br>
> On the one hand, bindgen automatically generated Rust wrappers for Gmsh's C header, so it could theoretically be part of the build pipeline and included in the main repo. On the other hand, there may not be a huge appetite for Rust support among Gmsh's users, especially compared to C++ and Python. My impression is using Rust for scientific codes is a bit of an ongoing experiment. <br>
> <br>
> On the maintenance side, packaging up an unofficial library crate for distribution might be an interesting possibility without Gmsh having to explicitly support yet another language API using the generator, especially with the semantic differences for things like error handling.  <br>
> <br>
> Please let me know if you have any comments or suggestions. <br>
> <br>
> Have a nice weekend! <br>
> <br>
> Max <br>
> -- <br>
> Max Orok<br>
> Contractor<br>
> <a href="http://www.mevex.com" rel="noreferrer" target="_blank">www.mevex.com</a><br>
> <br>
> <br>
> _______________________________________________<br>
> gmsh mailing list<br>
> <a href="mailto:gmsh@onelab.info" target="_blank">gmsh@onelab.info</a><br>
> <a href="http://onelab.info/mailman/listinfo/gmsh" rel="noreferrer" target="_blank">http://onelab.info/mailman/listinfo/gmsh</a><br>
<br>
— <br>
Prof. Christophe Geuzaine<br>
University of Liege, Electrical Engineering and Computer Science <br>
<a href="http://www.montefiore.ulg.ac.be/~geuzaine" rel="noreferrer" target="_blank">http://www.montefiore.ulg.ac.be/~geuzaine</a><br>
<br>
<br>
<br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div>Max Orok</div><div>Contractor<br></div></div><div dir="ltr"><a href="http://www.mevex.com" target="_blank">www.mevex.com</a><br><br><img src="https://docs.google.com/uc?export=download&id=1fHTIiW4OMUjQr1iOkspQ7wiEsxunoOs0&revid=0B6x5w-5zVaEjSkpwbm5oY29jbG1XMzJoYldXTmJpNGFtb3dVPQ" width="164" height="42"><br></div></div></div></div></div></div>