Use Gitea Releases for installation and ship VS Code highlighting
This commit is contained in:
1 parent
a46bd6e132
commit
201bdee372
243 files changed
+3289
-12521
No files matched your search
@@ -0,0 +1,150 @@
|
||||
public type UserStatus {
|
||||
Pending
|
||||
Active
|
||||
Disabled(reason: Text)
|
||||
}
|
||||
|
||||
public type CreateInput {
|
||||
id: Id
|
||||
name: Text
|
||||
email: Text
|
||||
phone: Text?
|
||||
score: Int
|
||||
labels: Map<Text, Text>
|
||||
}
|
||||
|
||||
public type CreateResult {
|
||||
Created(user: User)
|
||||
InvalidName(reason: Text)
|
||||
InvalidEmail(reason: Text)
|
||||
}
|
||||
|
||||
public type User {
|
||||
id: Id
|
||||
name: Text
|
||||
email: Text
|
||||
phone: Text?
|
||||
score: Int
|
||||
labels: Map<Text, Text>
|
||||
status: UserStatus
|
||||
}
|
||||
|
||||
public type UserView {
|
||||
id: Id
|
||||
name: Text
|
||||
email: Text
|
||||
phone: Text
|
||||
score: Int
|
||||
can_sign_in: Bool
|
||||
}
|
||||
|
||||
public create(input: CreateInput) (result: CreateResult) {
|
||||
normalized = normalize(input)
|
||||
result = create_name(normalized, normalized.name)
|
||||
}
|
||||
|
||||
normalize(input: CreateInput) (result: CreateInput) {
|
||||
result = input
|
||||
result.name = text.trim(input.name)
|
||||
result.email = text.lower(text.trim(input.email))
|
||||
}
|
||||
|
||||
create_name(input: CreateInput, name: "") (result: CreateResult) {
|
||||
result = CreateResult.InvalidName("name is required")
|
||||
}
|
||||
|
||||
create_name(input: CreateInput, name: other) (result: CreateResult) {
|
||||
result = create_email(input, name, input.email)
|
||||
}
|
||||
|
||||
create_email(input: CreateInput, name: Text, email: "") (result: CreateResult) {
|
||||
result = CreateResult.InvalidEmail("email is required")
|
||||
}
|
||||
|
||||
create_email(input: CreateInput, name: Text, email: other) (result: CreateResult) {
|
||||
user = User {
|
||||
id = input.id
|
||||
name = name
|
||||
email = email
|
||||
phone = input.phone
|
||||
score = input.score
|
||||
labels = input.labels
|
||||
status = UserStatus.Pending
|
||||
}
|
||||
result = CreateResult.Created(user)
|
||||
}
|
||||
|
||||
public activate(user: User) (result: User) {
|
||||
result = user
|
||||
result.status = UserStatus.Active
|
||||
}
|
||||
|
||||
public disable(user: User, reason: Text) (result: User) {
|
||||
result = user
|
||||
result.status = UserStatus.Disabled(reason)
|
||||
}
|
||||
|
||||
public can_sign_in(status: UserStatus.Active) (allowed: Bool) {
|
||||
allowed = true
|
||||
}
|
||||
|
||||
public can_sign_in(status: other) (allowed: Bool) {
|
||||
allowed = false
|
||||
}
|
||||
|
||||
phone_text(phone: Text) (result: Text) {
|
||||
result = phone
|
||||
}
|
||||
|
||||
phone_text(phone: null) (result: Text) {
|
||||
result = "Not provided"
|
||||
}
|
||||
|
||||
public to_view(user: User) (view: UserView) {
|
||||
view = UserView {
|
||||
id = user.id
|
||||
name = user.name
|
||||
email = user.email
|
||||
phone = phone_text(user.phone)
|
||||
score = user.score
|
||||
can_sign_in = can_sign_in(user.status)
|
||||
}
|
||||
}
|
||||
|
||||
public to_views(users: List<User>) (views: List<UserView>) {
|
||||
views = each(to_view, users)
|
||||
}
|
||||
|
||||
is_active(user: User) (result: Bool) {
|
||||
result = can_sign_in(user.status)
|
||||
}
|
||||
|
||||
public active_views(users: List<User>) (views: List<UserView>) {
|
||||
active = filter(is_active, users)
|
||||
views = each(to_view, active)
|
||||
}
|
||||
|
||||
has_id(user: User, expected: Id) (matches: Bool) {
|
||||
matches = user.id == expected
|
||||
}
|
||||
|
||||
public find_user(users: List<User>, id: Id) (user: User?) {
|
||||
user = find(has_id, users, id)
|
||||
}
|
||||
|
||||
public put_label(user: User, key: Text, value: Text) (result: User) {
|
||||
result = user
|
||||
result.labels = put(user.labels, key, value)
|
||||
}
|
||||
|
||||
public label(user: User, key: Text) (value: Text?) {
|
||||
value = get(user.labels, key)
|
||||
}
|
||||
|
||||
score_bonus(user: User, rate: Decimal) (amount: Decimal) {
|
||||
amount = user.score * rate
|
||||
}
|
||||
|
||||
public total_score_bonus(users: List<User>, rate: Decimal) (total: Decimal) {
|
||||
total = sum(score_bonus, users, rate)
|
||||
}
|
||||
@@ -4,17 +4,7 @@ use support::{checked, rejected, sources};
|
||||
|
||||
#[test]
|
||||
fn full_language_contract_package_checks_with_the_official_sources() {
|
||||
let prd = include_str!("../../../.trellis/tasks/09-04-dever-language-mvp/prd.md");
|
||||
let source = prd
|
||||
.split_once("## Complete Package Example\n")
|
||||
.unwrap()
|
||||
.1
|
||||
.split_once("```dever\n")
|
||||
.unwrap()
|
||||
.1
|
||||
.split_once("\n```")
|
||||
.unwrap()
|
||||
.0;
|
||||
let source = include_str!("../fixtures/core/complete_package.dever");
|
||||
let mut sources = dever_core::source::SourceMap::default();
|
||||
sources.add("account/user.dever", source);
|
||||
checked(&sources);
|
||||
|
||||
@@ -189,10 +189,7 @@ fn current_examples_official_packages_and_complete_contract_roundtrip() {
|
||||
assert_roundtrip_at(&path, source.text());
|
||||
}
|
||||
}
|
||||
let prd = include_str!("../../../.trellis/tasks/09-04-dever-language-mvp/prd.md");
|
||||
let (_, example) = prd.split_once("## Complete Package Example\n").unwrap();
|
||||
let (_, fenced) = example.split_once("```dever\n").unwrap();
|
||||
assert_roundtrip(fenced.split_once("\n```").unwrap().0);
|
||||
assert_roundtrip(include_str!("../fixtures/core/complete_package.dever"));
|
||||
}
|
||||
|
||||
fn source_root_relative(path: &FilePath) -> PathBuf {
|
||||
|
||||
@@ -47,10 +47,7 @@ fn assigned(expression: &str) -> Expression {
|
||||
|
||||
#[test]
|
||||
fn parses_the_complete_package_from_the_product_contract() {
|
||||
let prd = include_str!("../../../.trellis/tasks/09-04-dever-language-mvp/prd.md");
|
||||
let (_, example_section) = prd.split_once("## Complete Package Example\n").unwrap();
|
||||
let (_, fenced) = example_section.split_once("```dever\n").unwrap();
|
||||
let (source, _) = fenced.split_once("\n```").unwrap();
|
||||
let source = include_str!("../fixtures/core/complete_package.dever");
|
||||
let package = parsed(source);
|
||||
assert_eq!(
|
||||
package
|
||||
|
||||
Reference in new issue
Block a user