diff options
Diffstat (limited to 'src/main/scala/xyz/driver/restquery/utils/Utils.scala')
-rw-r--r-- | src/main/scala/xyz/driver/restquery/utils/Utils.scala | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/main/scala/xyz/driver/restquery/utils/Utils.scala b/src/main/scala/xyz/driver/restquery/utils/Utils.scala new file mode 100644 index 0000000..86c65d7 --- /dev/null +++ b/src/main/scala/xyz/driver/restquery/utils/Utils.scala @@ -0,0 +1,79 @@ +package xyz.driver.pdsuicommon.utils + +import java.time.LocalDateTime +import java.util.regex.{Matcher, Pattern} + +object Utils { + + implicit val localDateTimeOrdering: Ordering[LocalDateTime] = Ordering.fromLessThan(_ isBefore _) + + /** + * Hack to avoid scala compiler bug with getSimpleName + * @see https://issues.scala-lang.org/browse/SI-2034 + */ + def getClassSimpleName(klass: Class[_]): String = { + try { + klass.getSimpleName + } catch { + case _: InternalError => + val fullName = klass.getName.stripSuffix("$") + val fullClassName = fullName.substring(fullName.lastIndexOf(".") + 1) + fullClassName.substring(fullClassName.lastIndexOf("$") + 1) + } + } + + def toSnakeCase(str: String): String = + str + .replaceAll("([A-Z]+)([A-Z][a-z])", "$1_$2") + .replaceAll("([a-z\\d])([A-Z])", "$1_$2") + .toLowerCase + + def toCamelCase(str: String): String = { + val sb = new StringBuffer() + def loop(m: Matcher): Unit = if (m.find()) { + m.appendReplacement(sb, m.group(1).toUpperCase()) + loop(m) + } + val m: Matcher = Pattern.compile("_(.)").matcher(str) + loop(m) + m.appendTail(sb) + sb.toString + } + + object Whitespace { + private val Table: String = + "\u2002\u3000\r\u0085\u200A\u2005\u2000\u3000" + + "\u2029\u000B\u3000\u2008\u2003\u205F\u3000\u1680" + + "\u0009\u0020\u2006\u2001\u202F\u00A0\u000C\u2009" + + "\u3000\u2004\u3000\u3000\u2028\n\u2007\u3000" + + private val Multiplier: Int = 1682554634 + private val Shift: Int = Integer.numberOfLeadingZeros(Table.length - 1) + + def matches(c: Char): Boolean = Table.charAt((Multiplier * c) >>> Shift) == c + } + + def isSafeWhitespace(char: Char): Boolean = Whitespace.matches(char) + + // From Guava + def isSafeControl(char: Char): Boolean = + char <= '\u001f' || (char >= '\u007f' && char <= '\u009f') + + + def safeTrim(string: String): String = { + def shouldKeep(c: Char): Boolean = !isSafeControl(c) && !isSafeWhitespace(c) + + if (string.isEmpty) { + "" + } else { + val start = string.indexWhere(shouldKeep) + val end = string.lastIndexWhere(shouldKeep) + + if (start >= 0 && end >= 0) { + string.substring(start, end + 1) + } else { + "" + } + } + } +} |