Search

Dark theme | Light theme

February 2, 2022

DataWeave Delight: Wrapping string values

If we want to wrap a string value with another string value we can use the wrapWith and wrapIfMissing functions defined in the dw::core::Strings module. The first argument of these functions is the string we want to wrap and the second argument is the string value that wraps the first argument. The function wrapIfMissing will only apply the wrapper string if it was not already applied.

To remove a wrapped character from a wrapped string we can use the unwrap function. The first argument is the string value that is already wrapped and the second argument the character we want to use for unwrapping. The second argument can only be a single character, but we can repeatedly invoke the unwrap function to remove multiple wrap characters.

In the following example we use all three functions in different ways:

Source

%dw 2.0
import wrapWith, wrapIfMissing, unwrap from dw::core::Strings
output application/json  
---
{
  wrapWith: {
    // Wrap with single quotes
    sample1: wrapWith("DataWeave", "'"),

    // Even if already wrapped, keep on wrapping
    sample2: wrapWith("'DataWeave'", "'"),

    // We can use more than one character to wrap
    sample3: wrapWith("DataWeave", "{data}"),

    // Using infix notation
    sample4: "mrhaki" wrapWith "__"
  },

  wrapIfMissing: {
    // Wrap value only if not already wrapped  
    sample1: wrapIfMissing("DataWeave", "'"),

    // If already wrapped with given value then don't wrap
    sample2: wrapIfMissing("'DataWeave'", "'")
  },

  unwrap: {
    // Remove wrapping character(s)  
    sample1: unwrap("'DataWeave'", "'"),

    // If given wrap characters are not used, return the value
    sample2: unwrap("DataWeave", "'"),

    // Unwrap with more than one character only removes one wrap character
    sample3: unwrap("##DataWeave##", "##"),

    // Unwrap with more than one character gives unexpected results
    sample4: unwrap(unwrap("##DataWeave##", "#"), "#"),

    // With infix notation
    sample5: ("##DataWeave##" unwrap "#") unwrap "#"
  }
}

Output

{
  "wrapWith": {
    "sample1": "'DataWeave'",
    "sample2": "''DataWeave''",
    "sample3": "{data}DataWeave{data}",
    "sample4": "__mrhaki__"
  },
  "wrapIfMissing": {
    "sample1": "'DataWeave'",
    "sample2": "'DataWeave'"
  },
  "unwrap": {
    "sample1": "DataWeave",
    "sample2": "DataWeave",
    "sample3": "#DataWeave#",
    "sample4": "DataWeave",
    "sample5": "DataWeave"
  }
}

Written with DataWeave 2.4.