feat: implement Schema module for versioned types

Add Schema module with functions for creating and migrating versioned
values. This provides the runtime foundation for schema evolution.

Schema module functions:
- Schema.versioned(typeName, version, value) - create versioned value
- Schema.migrate(value, targetVersion) - migrate to new version
- Schema.getVersion(value) - get version number

Changes:
- Add Versioned, Migrate, GetVersion builtins to interpreter
- Add Schema module to global environment
- Add Schema module type to type environment
- Add 4 tests for schema operations
- Add examples/versioning.lux demonstrating usage

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-13 09:59:52 -05:00
parent 9511957076
commit 4eebaebb27
4 changed files with 187 additions and 0 deletions

View File

@@ -1333,6 +1333,50 @@ c")"#;
assert!(err_msg.contains("outside") || err_msg.contains("Resume"),
"Error should mention resume outside handler: {}", err_msg);
}
// Schema Evolution tests
#[test]
fn test_schema_versioned() {
let source = r#"
let user = Schema.versioned("User", 1, { name: "Alice", age: 30 })
let version = Schema.getVersion(user)
"#;
let (result, _) = run_with_effects(source, Value::Unit, Value::Unit).unwrap();
assert_eq!(result, "1");
}
#[test]
fn test_schema_migrate_same_version() {
let source = r#"
let user = Schema.versioned("User", 2, { name: "Bob" })
let migrated = Schema.migrate(user, 2)
let version = Schema.getVersion(migrated)
"#;
let (result, _) = run_with_effects(source, Value::Unit, Value::Unit).unwrap();
assert_eq!(result, "2");
}
#[test]
fn test_schema_migrate_upgrade() {
let source = r#"
let user = Schema.versioned("User", 1, { name: "Charlie" })
let migrated = Schema.migrate(user, 3)
let version = Schema.getVersion(migrated)
"#;
let (result, _) = run_with_effects(source, Value::Unit, Value::Unit).unwrap();
assert_eq!(result, "3");
}
#[test]
fn test_schema_migrate_downgrade_fails() {
let source = r#"
let user = Schema.versioned("User", 3, { name: "Dave" })
let migrated = Schema.migrate(user, 1)
"#;
let result = run_with_effects(source, Value::Unit, Value::Unit);
assert!(result.is_err());
assert!(result.unwrap_err().contains("downgrade"));
}
}
// Diagnostic rendering tests