mirror of
https://github.com/atom/atom.git
synced 2026-04-28 03:01:47 -04:00
100 lines
2.6 KiB
JavaScript
100 lines
2.6 KiB
JavaScript
const { Disposable } = require('event-kit');
|
|
|
|
// Extended: Manages the deserializers used for serialized state
|
|
//
|
|
// An instance of this class is always available as the `atom.deserializers`
|
|
// global.
|
|
//
|
|
// ## Examples
|
|
//
|
|
// ```coffee
|
|
// class MyPackageView extends View
|
|
// atom.deserializers.add(this)
|
|
//
|
|
// @deserialize: (state) ->
|
|
// new MyPackageView(state)
|
|
//
|
|
// constructor: (@state) ->
|
|
//
|
|
// serialize: ->
|
|
// @state
|
|
// ```
|
|
module.exports = class DeserializerManager {
|
|
constructor(atomEnvironment) {
|
|
this.atomEnvironment = atomEnvironment;
|
|
this.deserializers = {};
|
|
}
|
|
|
|
// Public: Register the given class(es) as deserializers.
|
|
//
|
|
// * `deserializers` One or more deserializers to register. A deserializer can
|
|
// be any object with a `.name` property and a `.deserialize()` method. A
|
|
// common approach is to register a *constructor* as the deserializer for its
|
|
// instances by adding a `.deserialize()` class method. When your method is
|
|
// called, it will be passed serialized state as the first argument and the
|
|
// {AtomEnvironment} object as the second argument, which is useful if you
|
|
// wish to avoid referencing the `atom` global.
|
|
add(...deserializers) {
|
|
for (let i = 0; i < deserializers.length; i++) {
|
|
let deserializer = deserializers[i];
|
|
this.deserializers[deserializer.name] = deserializer;
|
|
}
|
|
|
|
return new Disposable(() => {
|
|
for (let j = 0; j < deserializers.length; j++) {
|
|
let deserializer = deserializers[j];
|
|
delete this.deserializers[deserializer.name];
|
|
}
|
|
});
|
|
}
|
|
|
|
getDeserializerCount() {
|
|
return Object.keys(this.deserializers).length;
|
|
}
|
|
|
|
// Public: Deserialize the state and params.
|
|
//
|
|
// * `state` The state {Object} to deserialize.
|
|
deserialize(state) {
|
|
if (state == null) {
|
|
return;
|
|
}
|
|
|
|
const deserializer = this.get(state);
|
|
if (deserializer) {
|
|
let stateVersion =
|
|
(typeof state.get === 'function' && state.get('version')) ||
|
|
state.version;
|
|
|
|
if (
|
|
deserializer.version != null &&
|
|
deserializer.version !== stateVersion
|
|
) {
|
|
return;
|
|
}
|
|
return deserializer.deserialize(state, this.atomEnvironment);
|
|
} else {
|
|
return console.warn('No deserializer found for', state);
|
|
}
|
|
}
|
|
|
|
// Get the deserializer for the state.
|
|
//
|
|
// * `state` The state {Object} being deserialized.
|
|
get(state) {
|
|
if (state == null) {
|
|
return;
|
|
}
|
|
|
|
let stateDeserializer =
|
|
(typeof state.get === 'function' && state.get('deserializer')) ||
|
|
state.deserializer;
|
|
|
|
return this.deserializers[stateDeserializer];
|
|
}
|
|
|
|
clear() {
|
|
this.deserializers = {};
|
|
}
|
|
};
|