string-format.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. let string_format = f (
  2. 'string_format',
  3. 'function string_format (s: String, v: Representable) -> String',
  4. (s, v) => {
  5. return s.replace('${}', str(v))
  6. },
  7. 'function string_format (s: String, t: Struct) -> String',
  8. (s, t) => {
  9. let used = 0
  10. let result = s.replace(/\$\{([^}]+)\}/g, (match, p1) => {
  11. used += 1
  12. let key = p1
  13. ensure(t.schema.has_key(key), 'format_invalid_key', key)
  14. let value = t.get(key)
  15. ensure(is(value, Types.Representable), 'not_repr', p1)
  16. return str(value)
  17. })
  18. ensure(used != 0, 'format_none_converted')
  19. return result
  20. },
  21. 'function string_format (s: String, h: Hash) -> String',
  22. (s, h) => {
  23. let used = 0
  24. let result = s.replace(/\$\{([^}]+)\}/g, (match, p1) => {
  25. used += 1
  26. let key = p1
  27. let ok = has(key, h)
  28. ensure(ok, 'format_invalid_key', key)
  29. let value = h[key]
  30. ensure(is(value, Types.Representable), 'not_repr', p1)
  31. return str(value)
  32. })
  33. ensure(used != 0, 'format_none_converted')
  34. return result
  35. },
  36. 'function string_format (s: String, l: List) -> String',
  37. (s, l) => {
  38. ensure(l.length != 0, 'format_empty_list')
  39. let used = l.map(_ => false)
  40. let result = s.replace(/\$\{(\d+)\}/g, (match, p1) => {
  41. let index = parseInt(p1) - 1
  42. let ok = (0 <= index && index < l.length)
  43. ensure(ok, 'format_invalid_index', index)
  44. used[index] = true
  45. let value = l[index]
  46. ensure(is(value, Types.Representable), 'not_repr', p1)
  47. return str(value)
  48. })
  49. let ok = forall(used, i => i === true)
  50. ensure(ok, 'format_not_all_converted')
  51. return result
  52. }
  53. )