@@ -224,15 +224,47 @@ Elm.Native.Utils.make = function(elm) {
224 if (result < 0) extra.push(key);
224 if (result < 0) extra.push(key);
226 if (missing.length > 0) {
226 if (missing.length > 0) {
227− throw new Error("Module " + moduleName +
227+ throw new Error("Initialization Error: module " + moduleName +
228− " requires inputs for these ports: " + missing.join(', '));
228+ " was not given inputs for the following ports: " + missing.join(', '));
230 if (extra.length > 0) {
230 if (extra.length > 0) {
231− throw new Error("Module " + moduleName +
231+ throw new Error("Initialization Error: module " + moduleName +
232 " has been given ports that do not exist: " + extra.join(', '));
232 " has been given ports that do not exist: " + extra.join(', '));
236+ // On failure, return message. On success, return the value in an array.
237+ // Wrapping in an array allows the programmer to pass in a null value.
238+ function processInput(converter, v) {
239+ try { var elmValue = converter(v); }
240+ catch(e) { return "The given value caused a runtime error!\n" + e.toString(); }
242+ var ctor = elmValue.ctor;
243+ if (ctor === 'Nothing' || ctor === 'Left') {
244+ return "The port's conversion function failed.";
245+ } else if (ctor === 'Just' || ctor === 'Right') {
246+ return [elmValue._0];
250+ function portIn(name, converter) {
251+ var port = elm.ports_in[name];
252+ var result = processInput(converter, port.defaultValue);
253+ if (typeof result === 'string') {
254+ throw new Error("Initialization Error: The default value for port '" +
255+ name + "' is invalid.\n" + result);
257+ var signal = Signal.constant(result[0]);
258+ port.subscribe(function(v) {
259+ var result = processInput(converter, v);
260+ if (typeof result === 'string') {
261+ port.errorHandler(v)
263+ elm.notify(signal.id, result[0]);
236 function portOut(name, signal) {
268 function portOut(name, signal) {
237 var handlers = []
269 var handlers = []
238 function subscribe(handler) {
270 function subscribe(handler) {
@@ -250,10 +282,6 @@ Elm.Native.Utils.make = function(elm) {
250 elm.ports_out[name] = { subscribe:subscribe, unsubscribe:unsubscribe };
282 elm.ports_out[name] = { subscribe:subscribe, unsubscribe:unsubscribe };
251 return signal;
283 return signal;
253− function portIn(name, handler) {
254− var port = elm.ports_in[name];
255− throw new Error('need to decide on Elm.input definition.');
258 return elm.Native.Utils.values = {
286 return elm.Native.Utils.values = {