Util for building strings

(ns metabase.util.string
  (:require
   [clojure.string :as str]
   [metabase.util.i18n :refer [deferred-tru]]))

Join parts of a sentence together to build a compound one.

Options: - stop? (default true): whether to add a period at the end of the sentence

Examples:

(build-sentence ["foo" "bar" "baz"]) => "foo, bar and baz."

(build-sentence ["foo" "bar" "baz"] :stop? false) => "foo, bar and baz"

Note: this assumes we're building a sentence with parts from left to right, It might not works correctly with right-to-left language. Also not all language uses command and "and" to represting 'listing'.

(defn build-sentence
  ([parts]
   (build-sentence parts :stop? true))
  ([parts & {:keys [stop?]
             :or   {stop? true}
             :as options}]
   (when (seq parts)
     (cond
       (= (count parts) 1) (str (first parts) (when stop? \.))
       (= (count parts) 2) (str (first parts) " " (deferred-tru "and")  " " (second parts) (when stop? \.))
       :else               (str (first parts) ", " (build-sentence (rest parts) options))))))

Mask string value behind 'start...end' representation.

First four and last four symbols are shown. Even less if string is shorter than 8 chars.

(defn mask
  ([s]
   (mask s 4))
  ([s start-limit]
   (mask s start-limit 4))
  ([s start-limit end-limit]
   (if (str/blank? s)
     s
     (let [cnt (count s)]
       (str
        (subs s 0 (max 1 (min start-limit (- cnt 2))))
        "..."
        (when (< (+ end-limit start-limit) cnt)
          (subs s (- cnt end-limit) cnt)))))))