tags:
- Log
- GetValue
- SetValue
- AddProperty
- IsInRange
- Stringify
- utilities
Utility Functions¶
Helper functions for logging, dynamic property access, validation, and other utilities.
Logging¶
$Log¶
Outputs message to StandardOutput.
Signature:
Parameters:
message(string): Message to logformatString(string): .NET format string with placeholdersargs(any): Values for placeholders
Returns: null
Examples:
$Log("Hello World");
value = 42;
$Log("Value: " + $ToString(value));
// With format string
$Log("Customer {0} has premium {1}", name, premium);
$Log("Date: {0}, Amount: {1}", date, amount);
// Debugging
$Log("Processing item " + $ToString(i) + " of " + $ToString(total));
// Multiple values
$Log("Values: {0}, {1}, {2}", a, b, c);
Notes:
- Output captured in
EverSharpRunner.StandardOutput - Useful for debugging and tracing
- No console output in production usage
Dynamic Property Access¶
$GetValue¶
Gets object property value by name.
Signature:
Parameters:
object(Instance): Object to querypropertyName(string): Property name or path
Returns: (any) Property value, or null if not found
Examples:
customer = {
firstName: "John",
lastName: "Doe",
age: 35,
};
// Get property
firstName = $GetValue(customer, "firstName"); // "John"
age = $GetValue(customer, "age"); // 35
// Nested property access
policy = {
customer: {
contact: {
email: "john@example.com",
},
},
};
email = $GetValue(policy, "customer.contact.email");
// "john@example.com"
// Dynamic property name
fieldName = "premium";
value = $GetValue(policy, fieldName);
// Returns null if not found
missing = $GetValue(customer, "notExists"); // null
$SetValue¶
Sets object property value by name.
Signature: $SetValue(object, propertyName, value)
Parameters:
object(Instance): Object to modifypropertyName(string): Property namevalue(any): Value to set
Returns: null
Examples:
customer = { name: "Alice" };
$SetValue(customer, "age", 30);
age = customer.age; // 30
$SetValue(customer, "isActive", true);
// Dynamic property name
propertyName = "premium";
$SetValue(policy, propertyName, 1200);
// Update existing
$SetValue(customer, "age", 31);
Notes:
- Creates property if it doesn't exist
- Updates value if property exists
- Modifies object in-place
.AddProperty(name, value)¶
Adds property to object (instance method).
Signature: object.AddProperty(propertyName, value)
Parameters:
propertyName(string): Property namevalue(any): Property value
Returns: null
Examples:
customer = { name: "Alice" };
customer.AddProperty("age", 30);
customer.AddProperty("email", "alice@example.com");
age = customer.age; // 30
Notes:
- Similar to
$SetValuebut instance method - Creates new property
- Can update existing properties
Validation¶
$IsInRange¶
Checks if value is within range (inclusive).
Signature: $IsInRange(min, max, value)
Parameters:
min(decimal): Minimum value (inclusive)max(decimal): Maximum value (inclusive)value(decimal): Value to check
Returns: (boolean) True if value >= min AND value <= max
Examples:
inRange = $IsInRange(1, 10, 5); // true
inRange = $IsInRange(1, 10, 10); // true (inclusive)
inRange = $IsInRange(1, 10, 11); // false
// Age validation
ageValid = $IsInRange(18, 100, customerAge);
// Percentage validation
percentValid = $IsInRange(0, 100, percentage);
// In conditions
if ($IsInRange(100000, 500000, coverage)) {
// Standard coverage tier
}
// Filter
eligible = customers.Filter((c) => $IsInRange(25, 65, c.age));
HTTP Requests¶
$Fetch¶
Makes HTTP requests to external APIs and services.
Signature: $Fetch(url, options?)
Parameters:
url(string): URL to fetchoptions(object, optional): Request configurationmethod(string): HTTP method - "GET", "POST", "PUT", or "DELETE" (default: "GET")body(string): Request body for POST/PUT requests (use with$Stringify())
Returns: Response object with the following properties:
StatusCode(number): HTTP status code (e.g., 200, 404, 500)Ok(boolean):trueif request was successful (status 200-299)Body(object|array): Parsed JSON response body (only present on success)Error(string): Error message (only present on failure)
Examples:
// Simple GET request
response = $Fetch("https://api.example.com/data");
if (response.Ok) {
data = response.Body;
$Log("Received data:", data);
} else {
$Log("Error:", response.Error);
}
// Access response properties
status = response.StatusCode; // 200
isSuccess = response.Ok; // true
// GET with response handling
todos = $Fetch("https://api.example.com/todos");
firstItem = todos.Body[0];
itemId = firstItem.id;
// POST request with body
newItem = {
title: "New Todo",
completed: false,
userId: 1,
};
response = $Fetch("https://api.example.com/todos", {
method: "POST",
body: $Stringify(newItem),
});
if (response.Ok) {
created = response.Body;
$Log("Created item with ID:", created.id);
}
// PUT request to update
updatedItem = {
title: "Updated Todo",
completed: true,
userId: 1,
};
response = $Fetch("https://api.example.com/todos/1", {
method: "PUT",
body: $Stringify(updatedItem),
});
// DELETE request
response = $Fetch("https://api.example.com/todos/1", {
method: "DELETE",
});
if (response.Ok) {
$Log("Item deleted successfully");
}
// Error handling
response = $Fetch("https://api.example.com/unknown");
if (!response.Ok) {
$Log("Status:", response.StatusCode); // 404
$Log("Error:", response.Error); // "Not Found - {}"
}
Notes:
- Availability depends on environment setup
- May be restricted in production environments
- Synchronous call (blocks execution until response received)
- Response body is automatically parsed from JSON
- Does not currently support custom headers or authentication
- For authenticated APIs, consider C# integration or custom extension functions
Data Conversion Helpers¶
$Stringify¶
Converts value to JSON string (if available).
Signature: $Stringify(value)
Parameters:
value(any): Value to convert
Returns: (string) JSON representation
Examples:
object = {
name: "Alice",
age: 30,
isActive: true,
};
json = $Stringify(object);
// '{"name":"Alice","age":30,"isActive":true}'
array = [1, 2, 3, 4, 5];
jsonArray = $Stringify(array);
// '[1,2,3,4,5]'
Common Patterns¶
Pattern 1: Dynamic Field Access¶
function getField(object, fieldName, defaultValue) {
value = $GetValue(object, fieldName);
if (value == null) {
return defaultValue;
}
return value;
}
age = getField(customer, "age", 0);
Pattern 2: Conditional Logging¶
DEBUG = true;
function logDebug(message) {
if (DEBUG) {
$Log("[DEBUG] " + message);
}
}
logDebug("Processing item");
Pattern 3: Range Validation¶
function validateAge(age) {
if (!$IsInRange(18, 100, age)) {
return {
valid: false,
error: "Age must be between 18 and 100",
};
}
return { valid: true };
}
Pattern 4: Object Builder¶
function buildCustomer(data) {
customer = {};
$SetValue(customer, "firstName", data.firstName);
$SetValue(customer, "lastName", data.lastName);
$SetValue(customer, "age", data.age);
$SetValue(customer, "createdDate", $Today());
return customer;
}
Pattern 5: Trace Execution¶
function processOrder(order) {
$Log("=== Processing Order {0} ===", order.id);
$Log("Validating order...");
isValid = validateOrder(order);
$Log("Validation result: {0}", isValid);
if (isValid) {
$Log("Calculating total...");
total = calculateTotal(order);
$Log("Total: {0}", total);
}
$Log("=== Complete ===");
return total;
}
Pattern 6: Config-Driven Logic¶
config = {
minAge: 18,
maxAge: 100,
minCoverage: 50000,
maxCoverage: 1000000,
};
function validatePolicy(policy) {
minAge = $GetValue(config, "minAge");
maxAge = $GetValue(config, "maxAge");
if (!$IsInRange(minAge, maxAge, policy.customer.age)) {
return false;
}
minCoverage = $GetValue(config, "minCoverage");
maxCoverage = $GetValue(config, "maxCoverage");
if (!$IsInRange(minCoverage, maxCoverage, policy.coverage)) {
return false;
}
return true;
}
Best Practices¶
1. Check Property Existence¶
// Good
value = $GetValue(object, "property");
if (value != null) {
// Use value
}
// Risky
// value = object.property; // Fails if doesn't exist
2. Use Descriptive Log Messages¶
// Good
$Log(
"Processing customer {0} - Age: {1}, Premium: {2}",
customer.id,
customer.age,
customer.premium,
);
// Less helpful
$Log("Processing");
3. Validate Ranges Explicitly¶
// Good
if ($IsInRange(min, max, value)) {
// Process
}
// More verbose
if (value >= min && value <= max) {
// Process
}
4. Use $SetValue for Dynamic Properties¶
// Good - Dynamic
properties = ["name", "age", "email"];
properties.ForEach((prop) => {
$SetValue(object, prop, getValue(prop));
});
// Less flexible - Static
object.AddProperty("name", nameValue);
object.AddProperty("age", ageValue);
object.AddProperty("email", emailValue);
Advanced Examples¶
Example 1: Dynamic Object Mapper¶
function mapObject(source, mappings) {
target = {};
mappings.ForEach((mapping) => {
sourceField = mapping.source;
targetField = mapping.target;
value = $GetValue(source, sourceField);
$SetValue(target, targetField, value);
});
return target;
}
mappings = [
{ source: "firstName", target: "first_name" },
{ source: "lastName", target: "last_name" },
{ source: "age", target: "customer_age" },
];
customer = { firstName: "John", lastName: "Doe", age: 35 };
mapped = mapObject(customer, mappings);
Example 2: Validation Framework¶
function validate(object, rules) {
errors = [];
rules.ForEach((rule) => {
fieldName = rule.field;
value = $GetValue(object, fieldName);
if (rule.required && value == null) {
errors.Push(fieldName + " is required");
}
if (rule.min != null && rule.max != null) {
if (!$IsInRange(rule.min, rule.max, value)) {
errors.Push(
fieldName +
" must be between " +
$ToString(rule.min) +
" and " +
$ToString(rule.max),
);
}
}
});
return errors;
}
rules = [
{ field: "age", required: true, min: 18, max: 100 },
{ field: "coverage", required: true, min: 50000, max: 1000000 },
];
errors = validate(policy, rules);
Example 3: Execution Tracer¶
function trace(name, fn) {
$Log(">>> Entering: {0}", name);
startTime = $Now();
result = fn();
endTime = $Now();
duration = $DifferenceInSeconds(endTime, startTime);
$Log("<<< Exiting: {0} (Duration: {1}s)", name, duration);
return result;
}
result = trace("calculatePremium", () => {
return calculatePremium(coverage, age, risk);
});