Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement JavaString #540

Merged
merged 11 commits into from
Oct 6, 2023
Merged

Implement JavaString #540

merged 11 commits into from
Oct 6, 2023

Conversation

Earthcomputer
Copy link
Contributor

Objective

  • Solve the problem that NBT cannot be loaded when strings contain invalid UTF-16, such as in ban books.

Solution

  • This is the first part of the solution to this problem, a new string implementation which is tolerant of invalid UTF-16. See the added readme for details.
  • This allows for round-trip, useful manipulation of strings which may not be fully valid.
  • This solution is widely applicable outside of Valence when you have to deal with arbitrary Java strings, such as when manipulating class files.

@github-actions
Copy link

github-actions bot commented Oct 3, 2023

It looks like this pull request changed the workspace structure. Please replace assets/depgraph.svg with the following text:

depgraph.svg (Don't forget the trailing newline)
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
 -->
<!-- Title: %3 Pages: 1 -->
<svg width="1480pt" height="620pt"
 viewBox="0.00 0.00 1479.50 620.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 616)">
<title>%3</title>
<polygon fill="white" stroke="transparent" points="-4,4 -4,-616 1475.5,-616 1475.5,4 -4,4"/>
<!-- 0 -->
<g id="node1" class="node">
<title>0</title>
<polygon fill="none" stroke="black" points="573,-612 478,-612 478,-576 573,-576 573,-612"/>
<text text-anchor="middle" x="525.5" y="-590.3" font-family="Times,serif" font-size="14.00">java_string</text>
</g>
<!-- 1 -->
<g id="node2" class="node">
<title>1</title>
<polygon fill="none" stroke="black" points="173,-468 0,-468 0,-432 173,-432 173,-468"/>
<text text-anchor="middle" x="86.5" y="-446.3" font-family="Times,serif" font-size="14.00">valence_advancement</text>
</g>
<!-- 2 -->
<g id="node3" class="node">
<title>2</title>
<polygon fill="none" stroke="black" points="781,-396 658,-396 658,-360 781,-360 781,-396"/>
<text text-anchor="middle" x="719.5" y="-374.3" font-family="Times,serif" font-size="14.00">valence_server</text>
</g>
<!-- 1&#45;&gt;2 -->
<g id="edge1" class="edge">
<title>1&#45;&gt;2</title>
<path fill="none" stroke="black" d="M173.06,-433.36C176.24,-432.88 179.4,-432.43 182.5,-432 348.43,-409.15 544.53,-392.37 647.71,-384.32"/>
<polygon fill="black" stroke="black" points="648.01,-387.81 657.71,-383.55 647.47,-380.83 648.01,-387.81"/>
</g>
<!-- 3 -->
<g id="node4" class="node">
<title>3</title>
<polygon fill="none" stroke="black" points="707,-324 588,-324 588,-288 707,-288 707,-324"/>
<text text-anchor="middle" x="647.5" y="-302.3" font-family="Times,serif" font-size="14.00">valence_entity</text>
</g>
<!-- 2&#45;&gt;3 -->
<g id="edge2" class="edge">
<title>2&#45;&gt;3</title>
<path fill="none" stroke="black" d="M701.7,-359.7C692.9,-351.14 682.12,-340.66 672.5,-331.3"/>
<polygon fill="black" stroke="black" points="674.7,-328.57 665.09,-324.1 669.82,-333.58 674.7,-328.57"/>
</g>
<!-- 12 -->
<g id="node5" class="node">
<title>12</title>
<polygon fill="none" stroke="black" points="859.5,-324 725.5,-324 725.5,-288 859.5,-288 859.5,-324"/>
<text text-anchor="middle" x="792.5" y="-302.3" font-family="Times,serif" font-size="14.00">valence_registry</text>
</g>
<!-- 2&#45;&gt;12 -->
<g id="edge3" class="edge">
<title>2&#45;&gt;12</title>
<path fill="none" stroke="black" d="M737.54,-359.7C746.56,-351.05 757.62,-340.45 767.44,-331.03"/>
<polygon fill="black" stroke="black" points="769.87,-333.55 774.66,-324.1 765.02,-328.5 769.87,-333.55"/>
</g>
<!-- 11 -->
<g id="node6" class="node">
<title>11</title>
<polygon fill="none" stroke="black" points="814.5,-252 624.5,-252 624.5,-216 814.5,-216 814.5,-252"/>
<text text-anchor="middle" x="719.5" y="-230.3" font-family="Times,serif" font-size="14.00">valence_server_common</text>
</g>
<!-- 3&#45;&gt;11 -->
<g id="edge4" class="edge">
<title>3&#45;&gt;11</title>
<path fill="none" stroke="black" d="M665.3,-287.7C674.1,-279.14 684.88,-268.66 694.5,-259.3"/>
<polygon fill="black" stroke="black" points="697.18,-261.58 701.91,-252.1 692.3,-256.57 697.18,-261.58"/>
</g>
<!-- 12&#45;&gt;11 -->
<g id="edge12" class="edge">
<title>12&#45;&gt;11</title>
<path fill="none" stroke="black" d="M774.46,-287.7C765.44,-279.05 754.38,-268.45 744.56,-259.03"/>
<polygon fill="black" stroke="black" points="746.98,-256.5 737.34,-252.1 742.13,-261.55 746.98,-256.5"/>
</g>
<!-- 7 -->
<g id="node10" class="node">
<title>7</title>
<polygon fill="none" stroke="black" points="636.5,-180 500.5,-180 500.5,-144 636.5,-144 636.5,-180"/>
<text text-anchor="middle" x="568.5" y="-158.3" font-family="Times,serif" font-size="14.00">valence_protocol</text>
</g>
<!-- 11&#45;&gt;7 -->
<g id="edge11" class="edge">
<title>11&#45;&gt;7</title>
<path fill="none" stroke="black" d="M682.56,-215.88C662.01,-206.35 636.25,-194.41 614.41,-184.28"/>
<polygon fill="black" stroke="black" points="615.86,-181.1 605.32,-180.07 612.92,-187.45 615.86,-181.1"/>
</g>
<!-- 4 -->
<g id="node7" class="node">
<title>4</title>
<polygon fill="none" stroke="black" points="496.5,-36 382.5,-36 382.5,0 496.5,0 496.5,-36"/>
<text text-anchor="middle" x="439.5" y="-14.3" font-family="Times,serif" font-size="14.00">valence_math</text>
</g>
<!-- 5 -->
<g id="node8" class="node">
<title>5</title>
<polygon fill="none" stroke="black" points="748,-36 647,-36 647,0 748,0 748,-36"/>
<text text-anchor="middle" x="697.5" y="-14.3" font-family="Times,serif" font-size="14.00">valence_nbt</text>
</g>
<!-- 6 -->
<g id="node9" class="node">
<title>6</title>
<polygon fill="none" stroke="black" points="628.5,-36 514.5,-36 514.5,0 628.5,0 628.5,-36"/>
<text text-anchor="middle" x="571.5" y="-14.3" font-family="Times,serif" font-size="14.00">valence_ident</text>
</g>
<!-- 8 -->
<g id="node11" class="node">
<title>8</title>
<polygon fill="none" stroke="black" points="570.5,-108 420.5,-108 420.5,-72 570.5,-72 570.5,-108"/>
<text text-anchor="middle" x="495.5" y="-86.3" font-family="Times,serif" font-size="14.00">valence_generated</text>
</g>
<!-- 7&#45;&gt;8 -->
<g id="edge5" class="edge">
<title>7&#45;&gt;8</title>
<path fill="none" stroke="black" d="M550.46,-143.7C541.44,-135.05 530.38,-124.45 520.56,-115.03"/>
<polygon fill="black" stroke="black" points="522.98,-112.5 513.34,-108.1 518.13,-117.55 522.98,-112.5"/>
</g>
<!-- 10 -->
<g id="node12" class="node">
<title>10</title>
<polygon fill="none" stroke="black" points="694.5,-108 588.5,-108 588.5,-72 694.5,-72 694.5,-108"/>
<text text-anchor="middle" x="641.5" y="-86.3" font-family="Times,serif" font-size="14.00">valence_text</text>
</g>
<!-- 7&#45;&gt;10 -->
<g id="edge6" class="edge">
<title>7&#45;&gt;10</title>
<path fill="none" stroke="black" d="M586.54,-143.7C595.56,-135.05 606.62,-124.45 616.44,-115.03"/>
<polygon fill="black" stroke="black" points="618.87,-117.55 623.66,-108.1 614.02,-112.5 618.87,-117.55"/>
</g>
<!-- 8&#45;&gt;4 -->
<g id="edge7" class="edge">
<title>8&#45;&gt;4</title>
<path fill="none" stroke="black" d="M481.66,-71.7C475.01,-63.39 466.92,-53.28 459.61,-44.14"/>
<polygon fill="black" stroke="black" points="462.16,-41.73 453.18,-36.1 456.7,-46.1 462.16,-41.73"/>
</g>
<!-- 8&#45;&gt;6 -->
<g id="edge8" class="edge">
<title>8&#45;&gt;6</title>
<path fill="none" stroke="black" d="M514.29,-71.7C523.67,-63.05 535.18,-52.45 545.41,-43.03"/>
<polygon fill="black" stroke="black" points="547.95,-45.45 552.93,-36.1 543.2,-40.3 547.95,-45.45"/>
</g>
<!-- 10&#45;&gt;5 -->
<g id="edge9" class="edge">
<title>10&#45;&gt;5</title>
<path fill="none" stroke="black" d="M655.34,-71.7C661.99,-63.39 670.08,-53.28 677.39,-44.14"/>
<polygon fill="black" stroke="black" points="680.3,-46.1 683.82,-36.1 674.84,-41.73 680.3,-46.1"/>
</g>
<!-- 10&#45;&gt;6 -->
<g id="edge10" class="edge">
<title>10&#45;&gt;6</title>
<path fill="none" stroke="black" d="M624.2,-71.7C615.64,-63.14 605.16,-52.66 595.8,-43.3"/>
<polygon fill="black" stroke="black" points="598.15,-40.7 588.6,-36.1 593.2,-45.65 598.15,-40.7"/>
</g>
<!-- 9 -->
<g id="node13" class="node">
<title>9</title>
<polygon fill="none" stroke="black" points="1004.5,-612 852.5,-612 852.5,-576 1004.5,-576 1004.5,-612"/>
<text text-anchor="middle" x="928.5" y="-590.3" font-family="Times,serif" font-size="14.00">valence_build_utils</text>
</g>
<!-- 13 -->
<g id="node14" class="node">
<title>13</title>
<polygon fill="none" stroke="black" points="303.5,-468 191.5,-468 191.5,-432 303.5,-432 303.5,-468"/>
<text text-anchor="middle" x="247.5" y="-446.3" font-family="Times,serif" font-size="14.00">valence_anvil</text>
</g>
<!-- 13&#45;&gt;2 -->
<g id="edge13" class="edge">
<title>13&#45;&gt;2</title>
<path fill="none" stroke="black" stroke-dasharray="1,5" d="M303.77,-433.82C306.71,-433.17 309.64,-432.56 312.5,-432 428.87,-409.3 565.89,-393.72 647.57,-385.59"/>
<polygon fill="black" stroke="black" points="648.13,-389.05 657.74,-384.59 647.45,-382.09 648.13,-389.05"/>
</g>
<!-- 14 -->
<g id="node15" class="node">
<title>14</title>
<polygon fill="none" stroke="black" points="461.5,-468 321.5,-468 321.5,-432 461.5,-432 461.5,-468"/>
<text text-anchor="middle" x="391.5" y="-446.3" font-family="Times,serif" font-size="14.00">valence_boss_bar</text>
</g>
<!-- 14&#45;&gt;2 -->
<g id="edge14" class="edge">
<title>14&#45;&gt;2</title>
<path fill="none" stroke="black" d="M461.71,-433.88C464.68,-433.25 467.62,-432.62 470.5,-432 530.24,-419.21 598.06,-404.78 647.82,-394.21"/>
<polygon fill="black" stroke="black" points="648.78,-397.59 657.84,-392.08 647.33,-390.74 648.78,-397.59"/>
</g>
<!-- 15 -->
<g id="node16" class="node">
<title>15</title>
<polygon fill="none" stroke="black" points="625.5,-468 479.5,-468 479.5,-432 625.5,-432 625.5,-468"/>
<text text-anchor="middle" x="552.5" y="-446.3" font-family="Times,serif" font-size="14.00">valence_inventory</text>
</g>
<!-- 15&#45;&gt;2 -->
<g id="edge15" class="edge">
<title>15&#45;&gt;2</title>
<path fill="none" stroke="black" d="M593.35,-431.88C616.28,-422.26 645.08,-410.19 669.37,-400.01"/>
<polygon fill="black" stroke="black" points="670.91,-403.16 678.78,-396.07 668.2,-396.71 670.91,-403.16"/>
</g>
<!-- 16 -->
<g id="node17" class="node">
<title>16</title>
<polygon fill="none" stroke="black" points="1457.5,-396 1349.5,-396 1349.5,-360 1457.5,-360 1457.5,-396"/>
<text text-anchor="middle" x="1403.5" y="-374.3" font-family="Times,serif" font-size="14.00">valence_lang</text>
</g>
<!-- 17 -->
<g id="node18" class="node">
<title>17</title>
<polygon fill="none" stroke="black" points="1471.5,-468 1335.5,-468 1335.5,-432 1471.5,-432 1471.5,-468"/>
<text text-anchor="middle" x="1403.5" y="-446.3" font-family="Times,serif" font-size="14.00">valence_network</text>
</g>
<!-- 17&#45;&gt;2 -->
<g id="edge16" class="edge">
<title>17&#45;&gt;2</title>
<path fill="none" stroke="black" d="M1335.15,-433.43C1332.24,-432.91 1329.34,-432.44 1326.5,-432 1134.42,-402.54 905.44,-388.07 791.43,-382.24"/>
<polygon fill="black" stroke="black" points="791.59,-378.75 781.42,-381.74 791.23,-385.74 791.59,-378.75"/>
</g>
<!-- 17&#45;&gt;16 -->
<g id="edge17" class="edge">
<title>17&#45;&gt;16</title>
<path fill="none" stroke="black" d="M1403.5,-431.7C1403.5,-423.98 1403.5,-414.71 1403.5,-406.11"/>
<polygon fill="black" stroke="black" points="1407,-406.1 1403.5,-396.1 1400,-406.1 1407,-406.1"/>
</g>
<!-- 18 -->
<g id="node19" class="node">
<title>18</title>
<polygon fill="none" stroke="black" points="795.5,-468 643.5,-468 643.5,-432 795.5,-432 795.5,-468"/>
<text text-anchor="middle" x="719.5" y="-446.3" font-family="Times,serif" font-size="14.00">valence_player_list</text>
</g>
<!-- 18&#45;&gt;2 -->
<g id="edge18" class="edge">
<title>18&#45;&gt;2</title>
<path fill="none" stroke="black" d="M719.5,-431.7C719.5,-423.98 719.5,-414.71 719.5,-406.11"/>
<polygon fill="black" stroke="black" points="723,-406.1 719.5,-396.1 716,-406.1 723,-406.1"/>
</g>
<!-- 19 -->
<g id="node20" class="node">
<title>19</title>
<polygon fill="none" stroke="black" points="971,-468 814,-468 814,-432 971,-432 971,-468"/>
<text text-anchor="middle" x="892.5" y="-446.3" font-family="Times,serif" font-size="14.00">valence_scoreboard</text>
</g>
<!-- 19&#45;&gt;2 -->
<g id="edge19" class="edge">
<title>19&#45;&gt;2</title>
<path fill="none" stroke="black" d="M850.18,-431.88C826.32,-422.22 796.33,-410.09 771.1,-399.88"/>
<polygon fill="black" stroke="black" points="772.27,-396.57 761.68,-396.07 769.64,-403.06 772.27,-396.57"/>
</g>
<!-- 20 -->
<g id="node21" class="node">
<title>20</title>
<polygon fill="none" stroke="black" points="1148,-612 1023,-612 1023,-576 1148,-576 1148,-612"/>
<text text-anchor="middle" x="1085.5" y="-590.3" font-family="Times,serif" font-size="14.00">valence_spatial</text>
</g>
<!-- 21 -->
<g id="node22" class="node">
<title>21</title>
<polygon fill="none" stroke="black" points="1125.5,-468 989.5,-468 989.5,-432 1125.5,-432 1125.5,-468"/>
<text text-anchor="middle" x="1057.5" y="-446.3" font-family="Times,serif" font-size="14.00">valence_weather</text>
</g>
<!-- 21&#45;&gt;2 -->
<g id="edge20" class="edge">
<title>21&#45;&gt;2</title>
<path fill="none" stroke="black" d="M989.49,-433.92C986.45,-433.27 983.45,-432.62 980.5,-432 916.55,-418.45 843.62,-403.7 791.14,-393.21"/>
<polygon fill="black" stroke="black" points="791.75,-389.76 781.26,-391.23 790.38,-396.63 791.75,-389.76"/>
</g>
<!-- 22 -->
<g id="node23" class="node">
<title>22</title>
<polygon fill="none" stroke="black" points="1317,-468 1144,-468 1144,-432 1317,-432 1317,-468"/>
<text text-anchor="middle" x="1230.5" y="-446.3" font-family="Times,serif" font-size="14.00">valence_world_border</text>
</g>
<!-- 22&#45;&gt;2 -->
<g id="edge21" class="edge">
<title>22&#45;&gt;2</title>
<path fill="none" stroke="black" d="M1143.92,-433.47C1140.75,-432.96 1137.6,-432.47 1134.5,-432 1014.39,-413.71 874.06,-396.69 791.21,-387.09"/>
<polygon fill="black" stroke="black" points="791.49,-383.6 781.15,-385.93 790.69,-390.56 791.49,-383.6"/>
</g>
<!-- 23 -->
<g id="node24" class="node">
<title>23</title>
<polygon fill="none" stroke="black" points="718,-612 591,-612 591,-576 718,-576 718,-612"/>
<text text-anchor="middle" x="654.5" y="-590.3" font-family="Times,serif" font-size="14.00">dump_schedule</text>
</g>
<!-- 24 -->
<g id="node25" class="node">
<title>24</title>
<polygon fill="none" stroke="black" points="755,-540 684,-540 684,-504 755,-504 755,-540"/>
<text text-anchor="middle" x="719.5" y="-518.3" font-family="Times,serif" font-size="14.00">valence</text>
</g>
<!-- 23&#45;&gt;24 -->
<g id="edge22" class="edge">
<title>23&#45;&gt;24</title>
<path fill="none" stroke="black" d="M670.57,-575.7C678.44,-567.22 688.06,-556.86 696.67,-547.58"/>
<polygon fill="black" stroke="black" points="699.38,-549.81 703.62,-540.1 694.25,-545.05 699.38,-549.81"/>
</g>
<!-- 24&#45;&gt;1 -->
<g id="edge23" class="edge">
<title>24&#45;&gt;1</title>
<path fill="none" stroke="black" stroke-dasharray="1,5" d="M683.89,-518.44C599.09,-512.13 378.38,-494.52 183.21,-468.03"/>
<polygon fill="black" stroke="black" points="183.44,-464.53 173.06,-466.64 182.49,-471.47 183.44,-464.53"/>
</g>
<!-- 24&#45;&gt;13 -->
<g id="edge24" class="edge">
<title>24&#45;&gt;13</title>
<path fill="none" stroke="black" stroke-dasharray="1,5" d="M683.87,-517.89C614.46,-511.5 456.18,-495.32 313.98,-468.16"/>
<polygon fill="black" stroke="black" points="314.25,-464.64 303.77,-466.18 312.92,-471.52 314.25,-464.64"/>
</g>
<!-- 24&#45;&gt;14 -->
<g id="edge25" class="edge">
<title>24&#45;&gt;14</title>
<path fill="none" stroke="black" stroke-dasharray="1,5" d="M683.62,-513.39C637.12,-503.52 553.23,-485.7 471.64,-468.24"/>
<polygon fill="black" stroke="black" points="472.22,-464.79 461.71,-466.12 470.76,-471.63 472.22,-464.79"/>
</g>
<!-- 24&#45;&gt;15 -->
<g id="edge26" class="edge">
<title>24&#45;&gt;15</title>
<path fill="none" stroke="black" stroke-dasharray="1,5" d="M683.67,-505.98C660.03,-496.07 628.72,-482.95 602.61,-472.01"/>
<polygon fill="black" stroke="black" points="603.83,-468.72 593.26,-468.08 601.13,-475.18 603.83,-468.72"/>
</g>
<!-- 24&#45;&gt;17 -->
<g id="edge27" class="edge">
<title>24&#45;&gt;17</title>
<path fill="none" stroke="black" stroke-dasharray="1,5" d="M755.27,-519.51C847.89,-515.29 1103.22,-501.46 1324.95,-468.12"/>
<polygon fill="black" stroke="black" points="1325.79,-471.54 1335.15,-466.57 1324.74,-464.62 1325.79,-471.54"/>
</g>
<!-- 24&#45;&gt;18 -->
<g id="edge28" class="edge">
<title>24&#45;&gt;18</title>
<path fill="none" stroke="black" stroke-dasharray="1,5" d="M719.5,-503.7C719.5,-495.98 719.5,-486.71 719.5,-478.11"/>
<polygon fill="black" stroke="black" points="723,-478.1 719.5,-468.1 716,-478.1 723,-478.1"/>
</g>
<!-- 24&#45;&gt;19 -->
<g id="edge29" class="edge">
<title>24&#45;&gt;19</title>
<path fill="none" stroke="black" stroke-dasharray="1,5" d="M755.35,-506.5C780.05,-496.5 813.25,-483.06 840.81,-471.92"/>
<polygon fill="black" stroke="black" points="842.34,-475.07 850.3,-468.08 839.71,-468.58 842.34,-475.07"/>
</g>
<!-- 24&#45;&gt;21 -->
<g id="edge30" class="edge">
<title>24&#45;&gt;21</title>
<path fill="none" stroke="black" stroke-dasharray="1,5" d="M755,-513.99C803.39,-504.39 893.02,-486.46 979.51,-468.19"/>
<polygon fill="black" stroke="black" points="980.43,-471.57 989.49,-466.08 978.99,-464.73 980.43,-471.57"/>
</g>
<!-- 24&#45;&gt;22 -->
<g id="edge31" class="edge">
<title>24&#45;&gt;22</title>
<path fill="none" stroke="black" stroke-dasharray="1,5" d="M755.11,-517.04C825.37,-509.1 987,-490.2 1133.83,-468.06"/>
<polygon fill="black" stroke="black" points="1134.56,-471.49 1143.92,-466.53 1133.51,-464.57 1134.56,-471.49"/>
</g>
<!-- 25 -->
<g id="node26" class="node">
<title>25</title>
<polygon fill="none" stroke="black" points="513,-252 376,-252 376,-216 513,-216 513,-252"/>
<text text-anchor="middle" x="444.5" y="-230.3" font-family="Times,serif" font-size="14.00">packet_inspector</text>
</g>
<!-- 25&#45;&gt;7 -->
<g id="edge32" class="edge">
<title>25&#45;&gt;7</title>
<path fill="none" stroke="black" d="M474.83,-215.88C491.2,-206.64 511.58,-195.13 529.15,-185.21"/>
<polygon fill="black" stroke="black" points="531.06,-188.15 538.05,-180.19 527.62,-182.06 531.06,-188.15"/>
</g>
<!-- 26 -->
<g id="node27" class="node">
<title>26</title>
<polygon fill="none" stroke="black" points="834.5,-612 736.5,-612 736.5,-576 834.5,-576 834.5,-612"/>
<text text-anchor="middle" x="785.5" y="-590.3" font-family="Times,serif" font-size="14.00">playground</text>
</g>
<!-- 26&#45;&gt;24 -->
<g id="edge33" class="edge">
<title>26&#45;&gt;24</title>
<path fill="none" stroke="black" d="M769.19,-575.7C761.19,-567.22 751.43,-556.86 742.68,-547.58"/>
<polygon fill="black" stroke="black" points="745.03,-544.98 735.63,-540.1 739.94,-549.78 745.03,-544.98"/>
</g>
<!-- 27 -->
<g id="node28" class="node">
<title>27</title>
<polygon fill="none" stroke="black" points="606,-252 531,-252 531,-216 606,-216 606,-252"/>
<text text-anchor="middle" x="568.5" y="-230.3" font-family="Times,serif" font-size="14.00">stresser</text>
</g>
<!-- 27&#45;&gt;7 -->
<g id="edge34" class="edge">
<title>27&#45;&gt;7</title>
<path fill="none" stroke="black" d="M568.5,-215.7C568.5,-207.98 568.5,-198.71 568.5,-190.11"/>
<polygon fill="black" stroke="black" points="572,-190.1 568.5,-180.1 565,-190.1 572,-190.1"/>
</g>
</g>
</svg>

For reference, here is a diff against the old depgraph.svg:

diff --git a/assets/depgraph.svg b/assets/depgraph.svg
index b9523f6..8bb16f7 100644
--- a/assets/depgraph.svg
+++ b/assets/depgraph.svg
@@ -12,368 +12,374 @@
 <!-- 0 -->
 <g id="node1" class="node">
 <title>0</title>
-<polygon fill="none" stroke="black" points="173,-468 0,-468 0,-432 173,-432 173,-468"/>
-<text text-anchor="middle" x="86.5" y="-446.3" font-family="Times,serif" font-size="14.00">valence_advancement</text>
+<polygon fill="none" stroke="black" points="573,-612 478,-612 478,-576 573,-576 573,-612"/>
+<text text-anchor="middle" x="525.5" y="-590.3" font-family="Times,serif" font-size="14.00">java_string</text>
 </g>
 <!-- 1 -->
 <g id="node2" class="node">
 <title>1</title>
+<polygon fill="none" stroke="black" points="173,-468 0,-468 0,-432 173,-432 173,-468"/>
+<text text-anchor="middle" x="86.5" y="-446.3" font-family="Times,serif" font-size="14.00">valence_advancement</text>
+</g>
+<!-- 2 -->
+<g id="node3" class="node">
+<title>2</title>
 <polygon fill="none" stroke="black" points="781,-396 658,-396 658,-360 781,-360 781,-396"/>
 <text text-anchor="middle" x="719.5" y="-374.3" font-family="Times,serif" font-size="14.00">valence_server</text>
 </g>
-<!-- 0&#45;&gt;1 -->
+<!-- 1&#45;&gt;2 -->
 <g id="edge1" class="edge">
-<title>0&#45;&gt;1</title>
+<title>1&#45;&gt;2</title>
 <path fill="none" stroke="black" d="M173.06,-433.36C176.24,-432.88 179.4,-432.43 182.5,-432 348.43,-409.15 544.53,-392.37 647.71,-384.32"/>
 <polygon fill="black" stroke="black" points="648.01,-387.81 657.71,-383.55 647.47,-380.83 648.01,-387.81"/>
 </g>
-<!-- 2 -->
-<g id="node3" class="node">
-<title>2</title>
+<!-- 3 -->
+<g id="node4" class="node">
+<title>3</title>
 <polygon fill="none" stroke="black" points="707,-324 588,-324 588,-288 707,-288 707,-324"/>
 <text text-anchor="middle" x="647.5" y="-302.3" font-family="Times,serif" font-size="14.00">valence_entity</text>
 </g>
-<!-- 1&#45;&gt;2 -->
+<!-- 2&#45;&gt;3 -->
 <g id="edge2" class="edge">
-<title>1&#45;&gt;2</title>
+<title>2&#45;&gt;3</title>
 <path fill="none" stroke="black" d="M701.7,-359.7C692.9,-351.14 682.12,-340.66 672.5,-331.3"/>
 <polygon fill="black" stroke="black" points="674.7,-328.57 665.09,-324.1 669.82,-333.58 674.7,-328.57"/>
 </g>
-<!-- 11 -->
-<g id="node4" class="node">
-<title>11</title>
+<!-- 12 -->
+<g id="node5" class="node">
+<title>12</title>
 <polygon fill="none" stroke="black" points="859.5,-324 725.5,-324 725.5,-288 859.5,-288 859.5,-324"/>
 <text text-anchor="middle" x="792.5" y="-302.3" font-family="Times,serif" font-size="14.00">valence_registry</text>
 </g>
-<!-- 1&#45;&gt;11 -->
+<!-- 2&#45;&gt;12 -->
 <g id="edge3" class="edge">
-<title>1&#45;&gt;11</title>
+<title>2&#45;&gt;12</title>
 <path fill="none" stroke="black" d="M737.54,-359.7C746.56,-351.05 757.62,-340.45 767.44,-331.03"/>
 <polygon fill="black" stroke="black" points="769.87,-333.55 774.66,-324.1 765.02,-328.5 769.87,-333.55"/>
 </g>
-<!-- 10 -->
-<g id="node5" class="node">
-<title>10</title>
-<polygon fill="none" stroke="black" points="815.5,-252 625.5,-252 625.5,-216 815.5,-216 815.5,-252"/>
-<text text-anchor="middle" x="720.5" y="-230.3" font-family="Times,serif" font-size="14.00">valence_server_common</text>
+<!-- 11 -->
+<g id="node6" class="node">
+<title>11</title>
+<polygon fill="none" stroke="black" points="814.5,-252 624.5,-252 624.5,-216 814.5,-216 814.5,-252"/>
+<text text-anchor="middle" x="719.5" y="-230.3" font-family="Times,serif" font-size="14.00">valence_server_common</text>
 </g>
-<!-- 2&#45;&gt;10 -->
+<!-- 3&#45;&gt;11 -->
 <g id="edge4" class="edge">
-<title>2&#45;&gt;10</title>
-<path fill="none" stroke="black" d="M665.54,-287.7C674.56,-279.05 685.62,-268.45 695.44,-259.03"/>
-<polygon fill="black" stroke="black" points="697.87,-261.55 702.66,-252.1 693.02,-256.5 697.87,-261.55"/>
+<title>3&#45;&gt;11</title>
+<path fill="none" stroke="black" d="M665.3,-287.7C674.1,-279.14 684.88,-268.66 694.5,-259.3"/>
+<polygon fill="black" stroke="black" points="697.18,-261.58 701.91,-252.1 692.3,-256.57 697.18,-261.58"/>
 </g>
-<!-- 11&#45;&gt;10 -->
+<!-- 12&#45;&gt;11 -->
 <g id="edge12" class="edge">
-<title>11&#45;&gt;10</title>
-<path fill="none" stroke="black" d="M774.7,-287.7C765.9,-279.14 755.12,-268.66 745.5,-259.3"/>
-<polygon fill="black" stroke="black" points="747.7,-256.57 738.09,-252.1 742.82,-261.58 747.7,-256.57"/>
+<title>12&#45;&gt;11</title>
+<path fill="none" stroke="black" d="M774.46,-287.7C765.44,-279.05 754.38,-268.45 744.56,-259.03"/>
+<polygon fill="black" stroke="black" points="746.98,-256.5 737.34,-252.1 742.13,-261.55 746.98,-256.5"/>
 </g>
-<!-- 6 -->
-<g id="node9" class="node">
-<title>6</title>
-<polygon fill="none" stroke="black" points="637.5,-180 501.5,-180 501.5,-144 637.5,-144 637.5,-180"/>
-<text text-anchor="middle" x="569.5" y="-158.3" font-family="Times,serif" font-size="14.00">valence_protocol</text>
+<!-- 7 -->
+<g id="node10" class="node">
+<title>7</title>
+<polygon fill="none" stroke="black" points="636.5,-180 500.5,-180 500.5,-144 636.5,-144 636.5,-180"/>
+<text text-anchor="middle" x="568.5" y="-158.3" font-family="Times,serif" font-size="14.00">valence_protocol</text>
 </g>
-<!-- 10&#45;&gt;6 -->
+<!-- 11&#45;&gt;7 -->
 <g id="edge11" class="edge">
-<title>10&#45;&gt;6</title>
-<path fill="none" stroke="black" d="M683.56,-215.88C663.01,-206.35 637.25,-194.41 615.41,-184.28"/>
-<polygon fill="black" stroke="black" points="616.86,-181.1 606.32,-180.07 613.92,-187.45 616.86,-181.1"/>
-</g>
-<!-- 3 -->
-<g id="node6" class="node">
-<title>3</title>
-<polygon fill="none" stroke="black" points="497.5,-36 383.5,-36 383.5,0 497.5,0 497.5,-36"/>
-<text text-anchor="middle" x="440.5" y="-14.3" font-family="Times,serif" font-size="14.00">valence_math</text>
+<title>11&#45;&gt;7</title>
+<path fill="none" stroke="black" d="M682.56,-215.88C662.01,-206.35 636.25,-194.41 614.41,-184.28"/>
+<polygon fill="black" stroke="black" points="615.86,-181.1 605.32,-180.07 612.92,-187.45 615.86,-181.1"/>
 </g>
 <!-- 4 -->
 <g id="node7" class="node">
 <title>4</title>
-<polygon fill="none" stroke="black" points="749,-36 648,-36 648,0 749,0 749,-36"/>
-<text text-anchor="middle" x="698.5" y="-14.3" font-family="Times,serif" font-size="14.00">valence_nbt</text>
+<polygon fill="none" stroke="black" points="496.5,-36 382.5,-36 382.5,0 496.5,0 496.5,-36"/>
+<text text-anchor="middle" x="439.5" y="-14.3" font-family="Times,serif" font-size="14.00">valence_math</text>
 </g>
 <!-- 5 -->
 <g id="node8" class="node">
 <title>5</title>
-<polygon fill="none" stroke="black" points="629.5,-36 515.5,-36 515.5,0 629.5,0 629.5,-36"/>
-<text text-anchor="middle" x="572.5" y="-14.3" font-family="Times,serif" font-size="14.00">valence_ident</text>
+<polygon fill="none" stroke="black" points="748,-36 647,-36 647,0 748,0 748,-36"/>
+<text text-anchor="middle" x="697.5" y="-14.3" font-family="Times,serif" font-size="14.00">valence_nbt</text>
 </g>
-<!-- 7 -->
-<g id="node10" class="node">
-<title>7</title>
-<polygon fill="none" stroke="black" points="571.5,-108 421.5,-108 421.5,-72 571.5,-72 571.5,-108"/>
-<text text-anchor="middle" x="496.5" y="-86.3" font-family="Times,serif" font-size="14.00">valence_generated</text>
+<!-- 6 -->
+<g id="node9" class="node">
+<title>6</title>
+<polygon fill="none" stroke="black" points="628.5,-36 514.5,-36 514.5,0 628.5,0 628.5,-36"/>
+<text text-anchor="middle" x="571.5" y="-14.3" font-family="Times,serif" font-size="14.00">valence_ident</text>
 </g>
-<!-- 6&#45;&gt;7 -->
+<!-- 8 -->
+<g id="node11" class="node">
+<title>8</title>
+<polygon fill="none" stroke="black" points="570.5,-108 420.5,-108 420.5,-72 570.5,-72 570.5,-108"/>
+<text text-anchor="middle" x="495.5" y="-86.3" font-family="Times,serif" font-size="14.00">valence_generated</text>
+</g>
+<!-- 7&#45;&gt;8 -->
 <g id="edge5" class="edge">
-<title>6&#45;&gt;7</title>
-<path fill="none" stroke="black" d="M551.46,-143.7C542.44,-135.05 531.38,-124.45 521.56,-115.03"/>
-<polygon fill="black" stroke="black" points="523.98,-112.5 514.34,-108.1 519.13,-117.55 523.98,-112.5"/>
+<title>7&#45;&gt;8</title>
+<path fill="none" stroke="black" d="M550.46,-143.7C541.44,-135.05 530.38,-124.45 520.56,-115.03"/>
+<polygon fill="black" stroke="black" points="522.98,-112.5 513.34,-108.1 518.13,-117.55 522.98,-112.5"/>
 </g>
-<!-- 9 -->
-<g id="node11" class="node">
-<title>9</title>
-<polygon fill="none" stroke="black" points="695.5,-108 589.5,-108 589.5,-72 695.5,-72 695.5,-108"/>
-<text text-anchor="middle" x="642.5" y="-86.3" font-family="Times,serif" font-size="14.00">valence_text</text>
+<!-- 10 -->
+<g id="node12" class="node">
+<title>10</title>
+<polygon fill="none" stroke="black" points="694.5,-108 588.5,-108 588.5,-72 694.5,-72 694.5,-108"/>
+<text text-anchor="middle" x="641.5" y="-86.3" font-family="Times,serif" font-size="14.00">valence_text</text>
 </g>
-<!-- 6&#45;&gt;9 -->
+<!-- 7&#45;&gt;10 -->
 <g id="edge6" class="edge">
-<title>6&#45;&gt;9</title>
-<path fill="none" stroke="black" d="M587.54,-143.7C596.56,-135.05 607.62,-124.45 617.44,-115.03"/>
-<polygon fill="black" stroke="black" points="619.87,-117.55 624.66,-108.1 615.02,-112.5 619.87,-117.55"/>
+<title>7&#45;&gt;10</title>
+<path fill="none" stroke="black" d="M586.54,-143.7C595.56,-135.05 606.62,-124.45 616.44,-115.03"/>
+<polygon fill="black" stroke="black" points="618.87,-117.55 623.66,-108.1 614.02,-112.5 618.87,-117.55"/>
 </g>
-<!-- 7&#45;&gt;3 -->
+<!-- 8&#45;&gt;4 -->
 <g id="edge7" class="edge">
-<title>7&#45;&gt;3</title>
-<path fill="none" stroke="black" d="M482.66,-71.7C476.01,-63.39 467.92,-53.28 460.61,-44.14"/>
-<polygon fill="black" stroke="black" points="463.16,-41.73 454.18,-36.1 457.7,-46.1 463.16,-41.73"/>
+<title>8&#45;&gt;4</title>
+<path fill="none" stroke="black" d="M481.66,-71.7C475.01,-63.39 466.92,-53.28 459.61,-44.14"/>
+<polygon fill="black" stroke="black" points="462.16,-41.73 453.18,-36.1 456.7,-46.1 462.16,-41.73"/>
 </g>
-<!-- 7&#45;&gt;5 -->
+<!-- 8&#45;&gt;6 -->
 <g id="edge8" class="edge">
-<title>7&#45;&gt;5</title>
-<path fill="none" stroke="black" d="M515.29,-71.7C524.67,-63.05 536.18,-52.45 546.41,-43.03"/>
-<polygon fill="black" stroke="black" points="548.95,-45.45 553.93,-36.1 544.2,-40.3 548.95,-45.45"/>
+<title>8&#45;&gt;6</title>
+<path fill="none" stroke="black" d="M514.29,-71.7C523.67,-63.05 535.18,-52.45 545.41,-43.03"/>
+<polygon fill="black" stroke="black" points="547.95,-45.45 552.93,-36.1 543.2,-40.3 547.95,-45.45"/>
 </g>
-<!-- 9&#45;&gt;4 -->
+<!-- 10&#45;&gt;5 -->
 <g id="edge9" class="edge">
-<title>9&#45;&gt;4</title>
-<path fill="none" stroke="black" d="M656.34,-71.7C662.99,-63.39 671.08,-53.28 678.39,-44.14"/>
-<polygon fill="black" stroke="black" points="681.3,-46.1 684.82,-36.1 675.84,-41.73 681.3,-46.1"/>
+<title>10&#45;&gt;5</title>
+<path fill="none" stroke="black" d="M655.34,-71.7C661.99,-63.39 670.08,-53.28 677.39,-44.14"/>
+<polygon fill="black" stroke="black" points="680.3,-46.1 683.82,-36.1 674.84,-41.73 680.3,-46.1"/>
 </g>
-<!-- 9&#45;&gt;5 -->
+<!-- 10&#45;&gt;6 -->
 <g id="edge10" class="edge">
-<title>9&#45;&gt;5</title>
-<path fill="none" stroke="black" d="M625.2,-71.7C616.64,-63.14 606.16,-52.66 596.8,-43.3"/>
-<polygon fill="black" stroke="black" points="599.15,-40.7 589.6,-36.1 594.2,-45.65 599.15,-40.7"/>
+<title>10&#45;&gt;6</title>
+<path fill="none" stroke="black" d="M624.2,-71.7C615.64,-63.14 605.16,-52.66 595.8,-43.3"/>
+<polygon fill="black" stroke="black" points="598.15,-40.7 588.6,-36.1 593.2,-45.65 598.15,-40.7"/>
 </g>
-<!-- 8 -->
-<g id="node12" class="node">
-<title>8</title>
+<!-- 9 -->
+<g id="node13" class="node">
+<title>9</title>
 <polygon fill="none" stroke="black" points="1004.5,-612 852.5,-612 852.5,-576 1004.5,-576 1004.5,-612"/>
 <text text-anchor="middle" x="928.5" y="-590.3" font-family="Times,serif" font-size="14.00">valence_build_utils</text>
 </g>
-<!-- 12 -->
-<g id="node13" class="node">
-<title>12</title>
+<!-- 13 -->
+<g id="node14" class="node">
+<title>13</title>
 <polygon fill="none" stroke="black" points="303.5,-468 191.5,-468 191.5,-432 303.5,-432 303.5,-468"/>
 <text text-anchor="middle" x="247.5" y="-446.3" font-family="Times,serif" font-size="14.00">valence_anvil</text>
 </g>
-<!-- 12&#45;&gt;1 -->
+<!-- 13&#45;&gt;2 -->
 <g id="edge13" class="edge">
-<title>12&#45;&gt;1</title>
+<title>13&#45;&gt;2</title>
 <path fill="none" stroke="black" stroke-dasharray="1,5" d="M303.77,-433.82C306.71,-433.17 309.64,-432.56 312.5,-432 428.87,-409.3 565.89,-393.72 647.57,-385.59"/>
 <polygon fill="black" stroke="black" points="648.13,-389.05 657.74,-384.59 647.45,-382.09 648.13,-389.05"/>
 </g>
-<!-- 13 -->
-<g id="node14" class="node">
-<title>13</title>
+<!-- 14 -->
+<g id="node15" class="node">
+<title>14</title>
 <polygon fill="none" stroke="black" points="461.5,-468 321.5,-468 321.5,-432 461.5,-432 461.5,-468"/>
 <text text-anchor="middle" x="391.5" y="-446.3" font-family="Times,serif" font-size="14.00">valence_boss_bar</text>
 </g>
-<!-- 13&#45;&gt;1 -->
+<!-- 14&#45;&gt;2 -->
 <g id="edge14" class="edge">
-<title>13&#45;&gt;1</title>
+<title>14&#45;&gt;2</title>
 <path fill="none" stroke="black" d="M461.71,-433.88C464.68,-433.25 467.62,-432.62 470.5,-432 530.24,-419.21 598.06,-404.78 647.82,-394.21"/>
 <polygon fill="black" stroke="black" points="648.78,-397.59 657.84,-392.08 647.33,-390.74 648.78,-397.59"/>
 </g>
-<!-- 14 -->
-<g id="node15" class="node">
-<title>14</title>
+<!-- 15 -->
+<g id="node16" class="node">
+<title>15</title>
 <polygon fill="none" stroke="black" points="625.5,-468 479.5,-468 479.5,-432 625.5,-432 625.5,-468"/>
 <text text-anchor="middle" x="552.5" y="-446.3" font-family="Times,serif" font-size="14.00">valence_inventory</text>
 </g>
-<!-- 14&#45;&gt;1 -->
+<!-- 15&#45;&gt;2 -->
 <g id="edge15" class="edge">
-<title>14&#45;&gt;1</title>
+<title>15&#45;&gt;2</title>
 <path fill="none" stroke="black" d="M593.35,-431.88C616.28,-422.26 645.08,-410.19 669.37,-400.01"/>
 <polygon fill="black" stroke="black" points="670.91,-403.16 678.78,-396.07 668.2,-396.71 670.91,-403.16"/>
 </g>
-<!-- 15 -->
-<g id="node16" class="node">
-<title>15</title>
-<polygon fill="none" stroke="black" points="1457.5,-396 1349.5,-396 1349.5,-360 1457.5,-360 1457.5,-396"/>
-<text text-anchor="middle" x="1403.5" y="-374.3" font-family="Times,serif" font-size="14.00">valence_lang</text>
-</g>
 <!-- 16 -->
 <g id="node17" class="node">
 <title>16</title>
+<polygon fill="none" stroke="black" points="1457.5,-396 1349.5,-396 1349.5,-360 1457.5,-360 1457.5,-396"/>
+<text text-anchor="middle" x="1403.5" y="-374.3" font-family="Times,serif" font-size="14.00">valence_lang</text>
+</g>
+<!-- 17 -->
+<g id="node18" class="node">
+<title>17</title>
 <polygon fill="none" stroke="black" points="1471.5,-468 1335.5,-468 1335.5,-432 1471.5,-432 1471.5,-468"/>
 <text text-anchor="middle" x="1403.5" y="-446.3" font-family="Times,serif" font-size="14.00">valence_network</text>
 </g>
-<!-- 16&#45;&gt;1 -->
+<!-- 17&#45;&gt;2 -->
 <g id="edge16" class="edge">
-<title>16&#45;&gt;1</title>
+<title>17&#45;&gt;2</title>
 <path fill="none" stroke="black" d="M1335.15,-433.43C1332.24,-432.91 1329.34,-432.44 1326.5,-432 1134.42,-402.54 905.44,-388.07 791.43,-382.24"/>
 <polygon fill="black" stroke="black" points="791.59,-378.75 781.42,-381.74 791.23,-385.74 791.59,-378.75"/>
 </g>
-<!-- 16&#45;&gt;15 -->
+<!-- 17&#45;&gt;16 -->
 <g id="edge17" class="edge">
-<title>16&#45;&gt;15</title>
+<title>17&#45;&gt;16</title>
 <path fill="none" stroke="black" d="M1403.5,-431.7C1403.5,-423.98 1403.5,-414.71 1403.5,-406.11"/>
 <polygon fill="black" stroke="black" points="1407,-406.1 1403.5,-396.1 1400,-406.1 1407,-406.1"/>
 </g>
-<!-- 17 -->
-<g id="node18" class="node">
-<title>17</title>
+<!-- 18 -->
+<g id="node19" class="node">
+<title>18</title>
 <polygon fill="none" stroke="black" points="795.5,-468 643.5,-468 643.5,-432 795.5,-432 795.5,-468"/>
 <text text-anchor="middle" x="719.5" y="-446.3" font-family="Times,serif" font-size="14.00">valence_player_list</text>
 </g>
-<!-- 17&#45;&gt;1 -->
+<!-- 18&#45;&gt;2 -->
 <g id="edge18" class="edge">
-<title>17&#45;&gt;1</title>
+<title>18&#45;&gt;2</title>
 <path fill="none" stroke="black" d="M719.5,-431.7C719.5,-423.98 719.5,-414.71 719.5,-406.11"/>
 <polygon fill="black" stroke="black" points="723,-406.1 719.5,-396.1 716,-406.1 723,-406.1"/>
 </g>
-<!-- 18 -->
-<g id="node19" class="node">
-<title>18</title>
+<!-- 19 -->
+<g id="node20" class="node">
+<title>19</title>
 <polygon fill="none" stroke="black" points="971,-468 814,-468 814,-432 971,-432 971,-468"/>
 <text text-anchor="middle" x="892.5" y="-446.3" font-family="Times,serif" font-size="14.00">valence_scoreboard</text>
 </g>
-<!-- 18&#45;&gt;1 -->
+<!-- 19&#45;&gt;2 -->
 <g id="edge19" class="edge">
-<title>18&#45;&gt;1</title>
+<title>19&#45;&gt;2</title>
 <path fill="none" stroke="black" d="M850.18,-431.88C826.32,-422.22 796.33,-410.09 771.1,-399.88"/>
 <polygon fill="black" stroke="black" points="772.27,-396.57 761.68,-396.07 769.64,-403.06 772.27,-396.57"/>
 </g>
-<!-- 19 -->
-<g id="node20" class="node">
-<title>19</title>
-<polygon fill="none" stroke="black" points="1148,-612 1023,-612 1023,-576 1148,-576 1148,-612"/>
-<text text-anchor="middle" x="1085.5" y="-590.3" font-family="Times,serif" font-size="14.00">valence_spatial</text>
-</g>
 <!-- 20 -->
 <g id="node21" class="node">
 <title>20</title>
+<polygon fill="none" stroke="black" points="1148,-612 1023,-612 1023,-576 1148,-576 1148,-612"/>
+<text text-anchor="middle" x="1085.5" y="-590.3" font-family="Times,serif" font-size="14.00">valence_spatial</text>
+</g>
+<!-- 21 -->
+<g id="node22" class="node">
+<title>21</title>
 <polygon fill="none" stroke="black" points="1125.5,-468 989.5,-468 989.5,-432 1125.5,-432 1125.5,-468"/>
 <text text-anchor="middle" x="1057.5" y="-446.3" font-family="Times,serif" font-size="14.00">valence_weather</text>
 </g>
-<!-- 20&#45;&gt;1 -->
+<!-- 21&#45;&gt;2 -->
 <g id="edge20" class="edge">
-<title>20&#45;&gt;1</title>
+<title>21&#45;&gt;2</title>
 <path fill="none" stroke="black" d="M989.49,-433.92C986.45,-433.27 983.45,-432.62 980.5,-432 916.55,-418.45 843.62,-403.7 791.14,-393.21"/>
 <polygon fill="black" stroke="black" points="791.75,-389.76 781.26,-391.23 790.38,-396.63 791.75,-389.76"/>
 </g>
-<!-- 21 -->
-<g id="node22" class="node">
-<title>21</title>
+<!-- 22 -->
+<g id="node23" class="node">
+<title>22</title>
 <polygon fill="none" stroke="black" points="1317,-468 1144,-468 1144,-432 1317,-432 1317,-468"/>
 <text text-anchor="middle" x="1230.5" y="-446.3" font-family="Times,serif" font-size="14.00">valence_world_border</text>
 </g>
-<!-- 21&#45;&gt;1 -->
+<!-- 22&#45;&gt;2 -->
 <g id="edge21" class="edge">
-<title>21&#45;&gt;1</title>
+<title>22&#45;&gt;2</title>
 <path fill="none" stroke="black" d="M1143.92,-433.47C1140.75,-432.96 1137.6,-432.47 1134.5,-432 1014.39,-413.71 874.06,-396.69 791.21,-387.09"/>
 <polygon fill="black" stroke="black" points="791.49,-383.6 781.15,-385.93 790.69,-390.56 791.49,-383.6"/>
 </g>
-<!-- 22 -->
-<g id="node23" class="node">
-<title>22</title>
-<polygon fill="none" stroke="black" points="718,-612 591,-612 591,-576 718,-576 718,-612"/>
-<text text-anchor="middle" x="654.5" y="-590.3" font-family="Times,serif" font-size="14.00">dump_schedule</text>
-</g>
 <!-- 23 -->
 <g id="node24" class="node">
 <title>23</title>
+<polygon fill="none" stroke="black" points="718,-612 591,-612 591,-576 718,-576 718,-612"/>
+<text text-anchor="middle" x="654.5" y="-590.3" font-family="Times,serif" font-size="14.00">dump_schedule</text>
+</g>
+<!-- 24 -->
+<g id="node25" class="node">
+<title>24</title>
 <polygon fill="none" stroke="black" points="755,-540 684,-540 684,-504 755,-504 755,-540"/>
 <text text-anchor="middle" x="719.5" y="-518.3" font-family="Times,serif" font-size="14.00">valence</text>
 </g>
-<!-- 22&#45;&gt;23 -->
+<!-- 23&#45;&gt;24 -->
 <g id="edge22" class="edge">
-<title>22&#45;&gt;23</title>
+<title>23&#45;&gt;24</title>
 <path fill="none" stroke="black" d="M670.57,-575.7C678.44,-567.22 688.06,-556.86 696.67,-547.58"/>
 <polygon fill="black" stroke="black" points="699.38,-549.81 703.62,-540.1 694.25,-545.05 699.38,-549.81"/>
 </g>
-<!-- 23&#45;&gt;0 -->
+<!-- 24&#45;&gt;1 -->
 <g id="edge23" class="edge">
-<title>23&#45;&gt;0</title>
+<title>24&#45;&gt;1</title>
 <path fill="none" stroke="black" stroke-dasharray="1,5" d="M683.89,-518.44C599.09,-512.13 378.38,-494.52 183.21,-468.03"/>
 <polygon fill="black" stroke="black" points="183.44,-464.53 173.06,-466.64 182.49,-471.47 183.44,-464.53"/>
 </g>
-<!-- 23&#45;&gt;12 -->
+<!-- 24&#45;&gt;13 -->
 <g id="edge24" class="edge">
-<title>23&#45;&gt;12</title>
+<title>24&#45;&gt;13</title>
 <path fill="none" stroke="black" stroke-dasharray="1,5" d="M683.87,-517.89C614.46,-511.5 456.18,-495.32 313.98,-468.16"/>
 <polygon fill="black" stroke="black" points="314.25,-464.64 303.77,-466.18 312.92,-471.52 314.25,-464.64"/>
 </g>
-<!-- 23&#45;&gt;13 -->
+<!-- 24&#45;&gt;14 -->
 <g id="edge25" class="edge">
-<title>23&#45;&gt;13</title>
+<title>24&#45;&gt;14</title>
 <path fill="none" stroke="black" stroke-dasharray="1,5" d="M683.62,-513.39C637.12,-503.52 553.23,-485.7 471.64,-468.24"/>
 <polygon fill="black" stroke="black" points="472.22,-464.79 461.71,-466.12 470.76,-471.63 472.22,-464.79"/>
 </g>
-<!-- 23&#45;&gt;14 -->
+<!-- 24&#45;&gt;15 -->
 <g id="edge26" class="edge">
-<title>23&#45;&gt;14</title>
+<title>24&#45;&gt;15</title>
 <path fill="none" stroke="black" stroke-dasharray="1,5" d="M683.67,-505.98C660.03,-496.07 628.72,-482.95 602.61,-472.01"/>
 <polygon fill="black" stroke="black" points="603.83,-468.72 593.26,-468.08 601.13,-475.18 603.83,-468.72"/>
 </g>
-<!-- 23&#45;&gt;16 -->
+<!-- 24&#45;&gt;17 -->
 <g id="edge27" class="edge">
-<title>23&#45;&gt;16</title>
+<title>24&#45;&gt;17</title>
 <path fill="none" stroke="black" stroke-dasharray="1,5" d="M755.27,-519.51C847.89,-515.29 1103.22,-501.46 1324.95,-468.12"/>
 <polygon fill="black" stroke="black" points="1325.79,-471.54 1335.15,-466.57 1324.74,-464.62 1325.79,-471.54"/>
 </g>
-<!-- 23&#45;&gt;17 -->
+<!-- 24&#45;&gt;18 -->
 <g id="edge28" class="edge">
-<title>23&#45;&gt;17</title>
+<title>24&#45;&gt;18</title>
 <path fill="none" stroke="black" stroke-dasharray="1,5" d="M719.5,-503.7C719.5,-495.98 719.5,-486.71 719.5,-478.11"/>
 <polygon fill="black" stroke="black" points="723,-478.1 719.5,-468.1 716,-478.1 723,-478.1"/>
 </g>
-<!-- 23&#45;&gt;18 -->
+<!-- 24&#45;&gt;19 -->
 <g id="edge29" class="edge">
-<title>23&#45;&gt;18</title>
+<title>24&#45;&gt;19</title>
 <path fill="none" stroke="black" stroke-dasharray="1,5" d="M755.35,-506.5C780.05,-496.5 813.25,-483.06 840.81,-471.92"/>
 <polygon fill="black" stroke="black" points="842.34,-475.07 850.3,-468.08 839.71,-468.58 842.34,-475.07"/>
 </g>
-<!-- 23&#45;&gt;20 -->
+<!-- 24&#45;&gt;21 -->
 <g id="edge30" class="edge">
-<title>23&#45;&gt;20</title>
+<title>24&#45;&gt;21</title>
 <path fill="none" stroke="black" stroke-dasharray="1,5" d="M755,-513.99C803.39,-504.39 893.02,-486.46 979.51,-468.19"/>
 <polygon fill="black" stroke="black" points="980.43,-471.57 989.49,-466.08 978.99,-464.73 980.43,-471.57"/>
 </g>
-<!-- 23&#45;&gt;21 -->
+<!-- 24&#45;&gt;22 -->
 <g id="edge31" class="edge">
-<title>23&#45;&gt;21</title>
+<title>24&#45;&gt;22</title>
 <path fill="none" stroke="black" stroke-dasharray="1,5" d="M755.11,-517.04C825.37,-509.1 987,-490.2 1133.83,-468.06"/>
 <polygon fill="black" stroke="black" points="1134.56,-471.49 1143.92,-466.53 1133.51,-464.57 1134.56,-471.49"/>
 </g>
-<!-- 24 -->
-<g id="node25" class="node">
-<title>24</title>
-<polygon fill="none" stroke="black" points="514,-252 377,-252 377,-216 514,-216 514,-252"/>
-<text text-anchor="middle" x="445.5" y="-230.3" font-family="Times,serif" font-size="14.00">packet_inspector</text>
-</g>
-<!-- 24&#45;&gt;6 -->
-<g id="edge32" class="edge">
-<title>24&#45;&gt;6</title>
-<path fill="none" stroke="black" d="M475.83,-215.88C492.2,-206.64 512.58,-195.13 530.15,-185.21"/>
-<polygon fill="black" stroke="black" points="532.06,-188.15 539.05,-180.19 528.62,-182.06 532.06,-188.15"/>
-</g>
 <!-- 25 -->
 <g id="node26" class="node">
 <title>25</title>
+<polygon fill="none" stroke="black" points="513,-252 376,-252 376,-216 513,-216 513,-252"/>
+<text text-anchor="middle" x="444.5" y="-230.3" font-family="Times,serif" font-size="14.00">packet_inspector</text>
+</g>
+<!-- 25&#45;&gt;7 -->
+<g id="edge32" class="edge">
+<title>25&#45;&gt;7</title>
+<path fill="none" stroke="black" d="M474.83,-215.88C491.2,-206.64 511.58,-195.13 529.15,-185.21"/>
+<polygon fill="black" stroke="black" points="531.06,-188.15 538.05,-180.19 527.62,-182.06 531.06,-188.15"/>
+</g>
+<!-- 26 -->
+<g id="node27" class="node">
+<title>26</title>
 <polygon fill="none" stroke="black" points="834.5,-612 736.5,-612 736.5,-576 834.5,-576 834.5,-612"/>
 <text text-anchor="middle" x="785.5" y="-590.3" font-family="Times,serif" font-size="14.00">playground</text>
 </g>
-<!-- 25&#45;&gt;23 -->
+<!-- 26&#45;&gt;24 -->
 <g id="edge33" class="edge">
-<title>25&#45;&gt;23</title>
+<title>26&#45;&gt;24</title>
 <path fill="none" stroke="black" d="M769.19,-575.7C761.19,-567.22 751.43,-556.86 742.68,-547.58"/>
 <polygon fill="black" stroke="black" points="745.03,-544.98 735.63,-540.1 739.94,-549.78 745.03,-544.98"/>
 </g>
-<!-- 26 -->
-<g id="node27" class="node">
-<title>26</title>
-<polygon fill="none" stroke="black" points="607,-252 532,-252 532,-216 607,-216 607,-252"/>
-<text text-anchor="middle" x="569.5" y="-230.3" font-family="Times,serif" font-size="14.00">stresser</text>
+<!-- 27 -->
+<g id="node28" class="node">
+<title>27</title>
+<polygon fill="none" stroke="black" points="606,-252 531,-252 531,-216 606,-216 606,-252"/>
+<text text-anchor="middle" x="568.5" y="-230.3" font-family="Times,serif" font-size="14.00">stresser</text>
 </g>
-<!-- 26&#45;&gt;6 -->
+<!-- 27&#45;&gt;7 -->
 <g id="edge34" class="edge">
-<title>26&#45;&gt;6</title>
-<path fill="none" stroke="black" d="M569.5,-215.7C569.5,-207.98 569.5,-198.71 569.5,-190.11"/>
-<polygon fill="black" stroke="black" points="573,-190.1 569.5,-180.1 566,-190.1 573,-190.1"/>
+<title>27&#45;&gt;7</title>
+<path fill="none" stroke="black" d="M568.5,-215.7C568.5,-207.98 568.5,-198.71 568.5,-190.11"/>
+<polygon fill="black" stroke="black" points="572,-190.1 568.5,-180.1 565,-190.1 572,-190.1"/>
 </g>
 </g>
 </svg>

@Earthcomputer
Copy link
Contributor Author

Tests have been added.

I ran miri locally and it passed, but I couldn't figure out how to make it only compile and run these tests, so I didn't make a CI for it.

The "typos" are intentional parts of the string tests. Is there a way to get the typo checker to ignore certain lines?

@rj00a
Copy link
Member

rj00a commented Oct 4, 2023

Is there a way to get the typo checker to ignore certain lines?

Take a look at typos.toml. You can ignore whole files or use a regex.

Copy link
Member

@rj00a rj00a left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Haven't finished reviewing, but it's looking good! Lots of tests, the API is is what I'd expect, and I like that you've found a solution that works within the limitations of Borrow.

Maintenance burden should be low even though it's +7,000.

crates/java_string/src/cesu8.rs Outdated Show resolved Hide resolved
crates/java_string/src/cesu8.rs Outdated Show resolved Hide resolved
crates/java_string/src/cesu8.rs Outdated Show resolved Hide resolved
crates/java_string/src/cesu8.rs Outdated Show resolved Hide resolved
crates/java_string/src/cesu8.rs Outdated Show resolved Hide resolved
crates/java_string/src/cesu8.rs Outdated Show resolved Hide resolved
crates/java_string/README.md Outdated Show resolved Hide resolved
crates/java_string/src/char.rs Show resolved Hide resolved
crates/java_string/src/serde.rs Outdated Show resolved Hide resolved
crates/java_string/src/slice.rs Outdated Show resolved Hide resolved
Copy link
Member

@rj00a rj00a left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My eyes are starting to glaze over but LGTM 👍🏻

@rj00a rj00a merged commit 4e8a97c into valence-rs:main Oct 6, 2023
11 checks passed
@Earthcomputer Earthcomputer deleted the java_string branch October 6, 2023 02:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants