// Common interface to all error custom types.
interface ESpeaker {
	IError
	speak() string
}

// One custom error implementation.
struct MyError {
	// Mandatory fields from IError.
	msg  string
	code int
	// Custom field.
	blah string
}

// Interface implementation for this example custom type.
fn (e MyError) speak() string {
	return e.blah
}

fn (e MyError) msg() string {
	return e.msg
}

fn (e MyError) code() int {
	return e.code
}

// An example function that returns a custom error.
fn foo() !string {
	return MyError{
		msg:  'foo'
		blah: 'world'
	}
}

fn test_interface_embedding_smartcast() {
	x := foo() or {
		if err is ESpeaker {
			err.speak()
		} else {
			'undefined'
		}
	}
	println(x)
	assert x == 'world'
}
