Skip to content

Commit 556b9ee

Browse files
HandyS11claude
andcommitted
feat(commands): add DecayLine formatter (6b)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent d18e731 commit 556b9ee

2 files changed

Lines changed: 70 additions & 0 deletions

File tree

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using System.Globalization;
2+
using RustPlusBot.Features.ItemData.Data;
3+
4+
namespace RustPlusBot.Features.Commands.Formatting;
5+
6+
/// <summary>Formats the one-line decay reply.</summary>
7+
internal static class DecayLine
8+
{
9+
/// <summary>Formats base decay, any present environment variant, and HP for an item.</summary>
10+
/// <param name="item">The item (must have non-null <see cref="ItemRecord.Decay"/>).</param>
11+
public static string Format(ItemRecord item)
12+
{
13+
ArgumentNullException.ThrowIfNull(item);
14+
ArgumentNullException.ThrowIfNull(item.Decay);
15+
var decay = item.Decay;
16+
17+
var parts = new List<string>();
18+
Add(parts, null, decay.Seconds);
19+
Add(parts, "outside", decay.OutsideSeconds);
20+
Add(parts, "inside", decay.InsideSeconds);
21+
Add(parts, "underwater", decay.UnderwaterSeconds);
22+
23+
var decayPart = parts.Count > 0 ? string.Join(", ", parts) : "—";
24+
var hp = decay.Hp is { } h
25+
? string.Create(CultureInfo.InvariantCulture, $" · {h} HP")
26+
: string.Empty;
27+
return string.Create(CultureInfo.InvariantCulture, $"{item.Name} decays in {decayPart}{hp}");
28+
29+
static void Add(List<string> into, string? label, int? seconds)
30+
{
31+
if (seconds is not { } s)
32+
{
33+
return;
34+
}
35+
36+
var compact = DurationFormat.Compact(TimeSpan.FromSeconds(s));
37+
into.Add(label is null
38+
? compact
39+
: string.Create(CultureInfo.InvariantCulture, $"{label} {compact}"));
40+
}
41+
}
42+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using RustPlusBot.Features.Commands.Formatting;
2+
using RustPlusBot.Features.ItemData.Data;
3+
4+
namespace RustPlusBot.Features.Commands.Tests.Formatting;
5+
6+
public sealed class DecayFormatterTests
7+
{
8+
[Fact]
9+
public void DecayLine_ShowsBaseDecayAndHp()
10+
{
11+
var item = new ItemRecord(1, "Stone Barricade", 1, null, null, null, null,
12+
new DecayInfo(900, null, null, null, 100), null);
13+
var line = DecayLine.Format(item);
14+
Assert.Contains("Stone Barricade", line, StringComparison.Ordinal);
15+
Assert.Contains("15m", line, StringComparison.Ordinal);
16+
Assert.Contains("100", line, StringComparison.Ordinal);
17+
}
18+
19+
[Fact]
20+
public void DecayLine_ShowsVariantsWhenPresent()
21+
{
22+
var item = new ItemRecord(1, "Wall", 1, null, null, null, null,
23+
new DecayInfo(null, 3600, 7200, null, 250), null);
24+
var line = DecayLine.Format(item);
25+
Assert.Contains("outside", line, StringComparison.Ordinal);
26+
Assert.Contains("inside", line, StringComparison.Ordinal);
27+
}
28+
}

0 commit comments

Comments
 (0)