// Author: cirakg & claude ai // Summary: Small string helpers for parsing: trimming, clipping for messages, integer parsing, case-insensitive search. import Toybox.Lang; module Text { // Text without leading and trailing spaces, tabs and line breaks. function trim(text as String) as String { var chars = text.toCharArray(); var start = 0; var end = chars.size(); while (start < end && isSpace(chars[start])) { start++; } while (end > start && isSpace(chars[end - 1])) { end--; } return start == 0 && end == chars.size() ? text : text.substring(start, end) as String; } function isSpace(c as Char) as Boolean { return c == ' ' || c == '\t' || c == '\n' || c == '\r'; } // At most maxChars characters, with "…" when shortened (for messages that // quote user input). function clip(text as String, maxChars as Number) as String { return text.length() <= maxChars ? text : (text.substring(0, maxChars) as String) + "…"; } // A non-negative decimal integer (at most 18 digits), or null. function parseLong(text as String) as Long? { var chars = text.toCharArray(); if (chars.size() == 0 || chars.size() > 18) { return null; } var value = 0l; for (var i = 0; i < chars.size(); i++) { var c = chars[i]; if (c < '0' || c > '9') { return null; } value = value * 10 + (c.toNumber() - 48); } return value; } // Index of needle in haystack ignoring ASCII case, from `from`, or -1. function findIgnoreCase(haystack as String, needle as String, from as Number) as Number { var lower = haystack.toLower(); var rest = from == 0 ? lower : lower.substring(from, lower.length()) as String; var at = rest.find(needle.toLower()); return at == null ? -1 : at + from; } }