name: "Blog Generator with Custom JS Functions" description: "Demonstrates custom JavaScript template functions using Otto interpreter" # Custom JavaScript functions that can be used in templates functions: # Convert a string to a URL-friendly slug generateSlug: | function main() { var input = args[0] || ""; return input .toLowerCase() .replace(/[^a-z0-9]+/g, '-') .replace(/^-+|-+$/g, ''); } # Convert singular words to plural (simple English rules) - ES5 compatible pluralize: | function main() { var word = args[0] || ""; if (word.slice(-1) === 'y') { return word.slice(0, -1) + 'ies'; } else if (word.slice(-1) === 's' || word.slice(-2) === 'sh' || word.slice(-2) === 'ch' || word.slice(-1) === 'x' || word.slice(-1) === 'z') { return word + 'es'; } else { return word + 's'; } } # Generate validation rules based on field type generateValidation: | function main() { var fieldType = args[0] || ""; var fieldName = args[1] || "field"; switch (fieldType) { case 'string': return 'if len(' + fieldName + ') == 0 { return errors.New("' + fieldName + ' is required") }'; case 'uuid': return 'if _, err := uuid.Parse(' + fieldName + '); err != nil { return errors.New("invalid UUID format") }'; case 'boolean': return '// Boolean validation not required'; case 'timestamp': return 'if ' + fieldName + '.IsZero() { return errors.New("' + fieldName + ' is required") }'; default: return '// No validation rules for type: ' + fieldType; } } # Format a comment block formatComment: | function main() { var text = args[0] || ""; var lines = text.split('\n'); var result = '// ' + lines.join('\n// '); return result; } # Generate database field mapping dbFieldMapping: | function main() { var fieldName = args[0] || ""; var fieldType = args[1] || "string"; var dbType; switch (fieldType) { case 'string': dbType = 'VARCHAR(255)'; break; case 'text': dbType = 'TEXT'; break; case 'uuid': dbType = 'UUID'; break; case 'boolean': dbType = 'BOOLEAN'; break; case 'timestamp': dbType = 'TIMESTAMP'; break; default: dbType = 'VARCHAR(255)'; } return '`db:"' + fieldName.toLowerCase() + '" json:"' + fieldName + '"`'; } outputs: # Generate Go models for each entity using custom functions - path: "models/{{.Entity.Name | lower}}.go" template: "model" iterator: "entities" item_context: "Entity" # Generate controllers for each entity - path: "controllers/{{.Entity.Name | lower}}_controller.go" template: "controller" iterator: "entities" item_context: "Entity" # Generate a single router file - path: "router.go" template: "router" condition: "has_entities"