// typetag: "ss" (inlet, outlet) const Value Planet::link(const Value &val) { // std::cout << "link: " << val << std::endl; if (val.is_nil()) { return create_pending_links(); } Value error; Object *source = object_at(Url(val[0].str()), &error); if (error.is_error() || !object_at(Url(val[2].str()), &error)) { // not found if (val[1].str() == "=>") { return add_pending_link(val); } else if (val[1].str() == "||") { // remove from pending links return remove_pending_link(val); } return val; } Slot *slot = TYPE_CAST(Slot, source); Object *object; if (slot != NULL) { return val[1].str() == "||" ? slot->unlink(val[2]) : slot->link(val[2]); } else if ( (object = source->child("out")) && (object = object->first_child()) ) { // was a link default slots: /met/out --> /counter/in if ( (slot = TYPE_CAST(Slot, object)) ) { return val[1].str() == "||" ? slot->unlink(val[2]) : slot->link(val[2]); } else { return Value(BAD_REQUEST_ERROR, std::string("Object at '").append(slot->url()).append("' does not support links (using first child of '").append(source->url()).append("').")); } } else { return Value(BAD_REQUEST_ERROR, std::string("Object at '").append(source->url()).append("' does not support links (not an Outlet, Inlet or Node).")); } }